O usuário foi concedido, CREATE SESSION
mas só posso conectar ao CDB e não ao PDB. Por que é isso? Estou tentando isso no desenvolvedor SQL. Eu tenho Oracle 19c.
ellie-lumen's questions
Pergunta editada para maior clareza.
Objetivo: instalar o Oracle 19c no windows 10 e fazer um PDB.
Background: Instalei o Oracle em 2 computadores incorretamente (descompactei o arquivo oracle 19c em C:\App\db_home1
, instad em C:\App\oracle\product\19.3\db_home1
). Tentei corrigir isso desinstalando (manualmente seguindo estas instruções: https://www.youtube.com/watch?v=EHFbk_6ThAQ ). Agora estou tentando reinstalar.
Problema ao reinstalar no computador 1:
Quando executo o setup.exe, recebo um erro na etapa de instalação que diz [INS-20802] Oracle Database Configuration Assistant Failed
.
Quando abro "installActions2020-09-05_03-48-30PM", recebo este erro na parte inferior:INFO: [Sep 5, 2020 4:38:02 PM] [FATAL] Error while executing "C:\App\oracle\product\19.3\db_home1\rdbms\admin\dbmssml.sql". Refer to "C:\App\oracle\cfgtoollogs\dbca\orclglobal\dbmssml0.log" for more details. Error in Process: C:\App\oracle\product\19.3\db_home1\perl\bin\perl.exe
Quando vou para C:\App\oracle\cfgtoollogs\dbca\orclglobal\dbmssml0.log
, está em branco.
Tentando as sugestões de Joe:
C:\>echo %ORACLE_HOME%
%ORACLE_HOME%
C:\>where sqlplus
'where' is not recognized as an internal or external command,
operable program or batch file.
C:\>C:\App\oracle\product\19.db_home/deinstall/deinstall
The system cannot find the path specified.
C:\>
^ mas eu tenho sql plus ^ eu nunca tive uma variável env chamada oracle_home. isso retorna a variável env para a instalação oracle atual (que não está completa)
C:\>echo %path%
C:\App\oracle\product\19.3\db_home\bin;C:\Program Files (x86)\Applied Biosystems\QuantStudio Design
'Analysis' is not recognized as an internal or external command,
operable program or batch file.
Acho que a nova instalação que estou tentando instalar é a única coisa que o instalador está captando. Mas não sei o que fazer com esta mensagem. Onde eu corro isso?
Atualização: consigo me conectar ao CDB que crio, mas não há PDB$SEED.
Mas eu tenho um diretório de sementesC:\App\oracle\oradata\ORCL\pdbseed
Problema ao reinstalar no computador 2:
INS-30014: Unable to check whether the location specified is on CFS
Aqui está o que a Oracle tem a dizer sobre esse erro:
Explicação: O local especificado pode não ter as permissões necessárias.
Ação: Forneça um local que tenha as permissões necessárias apropriadas.
Todos os usuários (eu, administrador, todos os usuários possíveis) têm permissões totais na unidade D.
Outra solução que encontrei INS-30014
é desabilitar o adaptador de rede. Eu tentei isso e ainda não funcionou. (Minha ethernet já estava desabilitada, então desabilitei a internet e isso não mudou nada).
Estou tentando aprender a criar um PDB a partir do PDB$SEED e só tenho uma dúvida sobre este vídeo que tem sido ótimo para me dar informações de colher. Qual programa esse cara está usando para mkdir para seu create_file_dest
diretório? Além disso, onde ele está criando esse diretório? Ou, mais importante, onde se deve criar esse diretório e como sei que estou no lugar certo? Ele apenas sai e cria um diretório.. mas onde?
Eu tenho algumas tabelas que eu quero exportar. Estou usando este pacote (chamei de "CSV"): https://www.williamrobertson.net/documents/refcursor-to-csv.shtml
Consegui gravar em arquivos CSV antes de adicionar instruções CASE. Eu realmente espero que haja uma maneira de corrigi-lo porque minhas instruções CASE são super úteis.
O erro é:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "SYS.DBMS_SQL", line 2084
ORA-06512: at "C##USER1.CSV", line 38
ORA-06512: at "C##USER1.CSV", line 162
ORA-06512: at line 1
ORA-06512: at "C##USER1.CSV", line 278
ORA-06512: at "C##USER1.CSV", line 278
ORA-06512: at "C##USER1.EXPORT_02_PRODUCED_PURIFIED", line 5
ORA-06512: at "C##USER1.EXPORT_ALL_LYS_FOR_TABLEAU", line 5
Aqui é onde os erros apontam para:
ORA-06512: at "C##USER1.EXPORT_02_PRODUCED_PURIFIED", line 5
é aqui:
CREATE OR REPLACE VIEW vw_export_02_produced_purified AS SELECT
pk_purified_enz_id,
fk_construct_id as "fk_for_construct",
fk_expr_system as "expression_system",
CASE pr.valid
WHEN 1 THEN 'Yes'
WHEN 0 THEN 'No'
END as "Is this growth ok?",
g_batch,
p_batch,
pur.concentration as "Concentration (uM)",
pur.abts5_pur_checkpoint as "purification checkpoint",
pur.yield as "Yield (mg/L)",
CASE
WHEN pk_purified_enz_id IS NULL THEN ' '
WHEN pk_purified_enz_id IS NOT NULL THEN
buffer_mol || ' mM, ' ||
fk_final_buffer_system || ' ' ||
'pH ' || final_ph || ', ' ||
final_nacl || ' mM NaCl' ||
CASE
WHEN final_add IS NULL THEN ' '
WHEN final_add IS NOT NULL THEN ', ' || final_add
END
END AS "Purification Buffer",
buffer_mol,
fk_final_buffer_system as "buffer system",
final_ph,
final_nacl,
final_add as "other buffer additives"
FROM produced pr FULL OUTER JOIN purified_enz pur
on pr.pk_produced_id = pur.fk_produced_id;
CREATE OR REPLACE PROCEDURE EXPORT_02_PRODUCED_PURIFIED AS
l_dataset sys_refcursor;
begin
open l_dataset for select * from vw_export_02_produced_purified;
csv.write_file
( p_dataset => l_dataset
, p_heading => 'Y'
, p_directory => 'EXTRACT_DIR'
, p_filename => '02_produced_purified.txt' );
END EXPORT_02_PRODUCED_PURIFIED;
/
Este ORA-06512: at "C##USER1.EXPORT_ALL_LYS_FOR_TABLEAU", line 5
é do procedimento mestre que combina todos os procedimentos menores.
CREATE OR REPLACE PROCEDURE EXPORT_ALL_LYS_FOR_TABLEAU AS
BEGIN
EXPORT_00_CPP;
EXPORT_01_CONSTRUCT;
EXPORT_02_PRODUCED_PURIFIED;
EXPORT_03_CHAR;
EXPORT_04_CELL_DATA;
END EXPORT_ALL_LYS_FOR_TABLEAU;
/
DDL para tabelas referenciadas:
CREATE TABLE PRODUCED (
pk_produced_id NUMBER GENERATED ALWAYS AS IDENTITY,
fk_construct_id NUMBER NOT NULL,
g_batch VARCHAR2 (50) NOT NULL,
full_g_batch VARCHAR2 (200) GENERATED ALWAYS AS (g_batch || '-' || fk_construct_id) VIRTUAL,
valid NUMBER (1) DEFAULT 1,
fk_expr_system VARCHAR2 (50),
CONSTRAINT pk_produced_id PRIMARY KEY (pk_produced_id),
CONSTRAINT fk_p_construct_id FOREIGN KEY (fk_construct_id) REFERENCES construct (pk_construct_id),
CONSTRAINT fk_expr_system FOREIGN KEY (fk_expr_system) REFERENCES EXPR_SYSTEM(pk_expr_system),
CONSTRAINT uq_produced UNIQUE (fk_construct_id, g_batch)
);
CREATE TABLE PURIFIED_ENZ (
pk_purified_enz_id NUMBER GENERATED ALWAYS AS IDENTITY,
fk_produced_id NUMBER,
p_batch VARCHAR2 (50) NOT NULL,
pur_profile BLOB,
fk_final_buffer_system VARCHAR2 (50),
buffer_mol NUMBER (6, 2),
final_nacl NUMBER (4),
final_ph NUMBER (4, 2),
final_add VARCHAR2 (50),
yield NUMBER (6, 2),
concentration NUMBER (6, 2),
abts5_pur_checkpoint NUMBER (5, 2),
CONSTRAINT pk_purified_enz_id PRIMARY KEY (pk_purified_enz_id),
CONSTRAINT fk_produced_id FOREIGN KEY (fk_produced_id) REFERENCES produced (pk_produced_id),
CONSTRAINT fk_final_buffer_system FOREIGN KEY (fk_final_buffer_system) REFERENCES buffer_system (pk_final_buffer_system),
CONSTRAINT uq_purified_enz UNIQUE (fk_produced_id, p_batch)
);
Eu tenho algumas tabelas que eu junto que acho que seriam perfeitas para colocar em um cluster. Mas também espero inserir dados neles toda semana. Não é uma grande quantidade de dados - algo como 5 a 20 registros por semana. Meu entendimento é que os clusters são bons para tabelas que você une e seleciona, mas não tão bons se você planeja usar instruções DML neles.
Minha pergunta é: quando a documentação do Oracle diz que o clustering não é eficiente para usar com instruções DML, eles estão se referindo à atualização e exclusão de centenas de registros? Ou uma pequena quantidade de registros inseridos também se enquadraria nessa diretriz? Minha pergunta é essencialmente: a escala das instruções DML afeta a eficiência do clustering? Ou é mais uma situação binária. Tipo, se eu estivesse atualizando um registro todos os dias, devo evitar colocar minhas tabelas em um cluster?
Não consigo agendar uma tarefa para ser executada.
Fiz um procedimento que grava arquivos CSV e funciona quando o executo.
Então tentei fazer um job para agendar:
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'AUTOMATE_CSV_EXPORT',
job_type => 'STORED_PROCEDURE',
job_action => 'EXPORT_ALL_LYS_FOR_TABLEAU',
number_of_arguments => 0,
start_date => '20-AUG-20 2.05.00PM',
repeat_interval => 'FREQ=WEEKLY; BYDAY=FRI; BYHOUR=23;',
end_date => NULL,
enabled => FALSE,
auto_drop => FALSE,
comments => 'hello i am a comment');
DBMS_SCHEDULER.SET_ATTRIBUTE(
name => 'AUTOMATE_CSV_EXPORT',
attribute => 'logging_level',
value => DBMS_SCHEDULER.LOGGING_RUNS);
DBMS_SCHEDULER.enable(
name => 'AUTOMATE_CSV_EXPORT');
END;
/
Ele não foi executado no horário agendado, mas funcionou quando eu o executei assim:
Tentei editar a hora de início no assistente e me dá este erro:
Programei-o para ser executado a cada 2 minutos a partir de um tempo atrás, e ainda não foi executado. Está definitivamente habilitado.
Solução de problemas
TLDR: agendador funciona!!! A única coisa que não funciona é eu colocar meu e-mail para receber notificações.
Mudei o trabalho para ser executado a cada 2 minutos. ^^^ então está funcionando? Mas não vejo nenhum CSV na pasta de destino. Alterei a data de início para NULL como o código abaixo e funcionou! Eu tenho CSV!
- Testando um trabalho agendado: test:
create or replace procedure test_print
is
begin
dbms_output.put_line('Current date and time is : ' ||
to_char(sysdate,'DD-MON-YYYY HH:MI:SS AM'));
end;
set serveroutput on;
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'JOB_TEST',
job_type => 'STORED_PROCEDURE',
job_action => 'TEST_PRINT',
number_of_arguments => 0,
start_date => NULL,
repeat_interval => 'FREQ=MINUTELY;INTERVAL=2;',
end_date => NULL,
enabled => FALSE,
auto_drop => FALSE,
comments => 'Testing job runs');
DBMS_SCHEDULER.enable(name => 'JOB_TEST');
END;
/
select job_name,output,status,owner
from user_scheduler_job_run_details where job_name='JOB_TEST';
O que ainda não funciona são as notificações por e-mail. Quando essa é a única coisa que edito, recebo este erro:
Este é o meu procedimento original que funciona lindamente:
create or replace PROCEDURE EXTRACT_0_CPP AS
CURSOR c_data IS
SELECT cpp,
rfu1,
rfu2,
mean_rfu,
charge_ph7_4,
hydropathy
FROM cpp
ORDER BY LENGTH(cpp);
F1 UTL_FILE.FILE_TYPE;
BEGIN
F1 := UTL_FILE.FOPEN( location => 'EXTRACT_DIR',
filename => '0_cpp.TXT',
open_mode => 'w',
max_linesize => 32767);
FOR cur_rec IN c_data LOOP
UTL_FILE.PUT_LINE (F1,
cur_rec.cpp || ':' ||
cur_rec.rfu1 || ':' ||
cur_rec.rfu2 || ':' ||
cur_rec.mean_rfu || ':' ||
cur_rec.charge_ph7_4 || ':' ||
cur_rec.hydropathy);
END LOOP;
UTL_FILE.FCLOSE(F1);
END;
Mas o SQL Developer me dá uma linha vermelha SELECT
e sugere que eu mude para isso:
create or replace PROCEDURE EXTRACT_0_CPP AS
CURSOR c_data IS
SELECT
"A1"."CPP" "CPP",
"A1"."RFU1" "RFU1",
"A1"."RFU2" "RFU2",
"A1"."MEAN_RFU" "MEAN_RFU",
"A1"."CHARGE_PH7_4" "CHARGE_PH7_4",
"A1"."HYDROPATHY" "HYDROPATHY"
FROM
"C##ELLIE"."CPP" "A1"
ORDER BY
length("A1"."CPP");
F1 UTL_FILE.FILE_TYPE;
BEGIN
F1 := UTL_FILE.FOPEN( location => 'EXTRACT_DIR',
filename => '0_cpp.TXT',
open_mode => 'w',
max_linesize => 32767);
FOR cur_rec IN c_data LOOP
UTL_FILE.PUT_LINE (F1,
cur_rec.pk_cpp || ':' ||
cur_rec.rfu1 || ':' ||
cur_rec.rfu2 || ':' ||
cur_rec.mean_rfu || ':' ||
cur_rec.charge_ph7_4 || ':' ||
cur_rec.hydropathy);
END LOOP;
UTL_FILE.FCLOSE(F1);
END;
Minha pergunta é (por que) isso é melhor? O que é "A1"?
Estou tentando inserir dados de uma tabela externa.
INSERT /*+ ignore_row_on_dupkey_index ( consruct ( construct_id ) ) */
INTO construct
(construct_id,
n_term ,
enz_name,
c_term,
cpp,
mutations,
mw_kda)
SELECT *
FROM EXTERNAL ((
construct_id NUMBER(10),
n_term VARCHAR2 (50),
enz_name VARCHAR2 (50),
c_term VARCHAR2 (50),
cpp VARCHAR2 (50),
mutations VARCHAR2 (50),
mw_kda NUMBER (7,3))
TYPE ORACLE_LOADER
DEFAULT DIRECTORY data_to_input
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
SKIP 1
BADFILE bad_files:'badflie_insert_into_construct_from_construct.bad'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
MISSING FIELD VALUES ARE NULL
)
LOCATION ('CONSTRUCT.CSV')
REJECT LIMIT UNLIMITED) ext
WHERE NOT EXISTS (
SELECT * FROM construct c
WHERE c.n_term = ext.n_term
AND c.enz_name = ext.enz_name
AND c.c_term = ext.c_term
AND c.cpp = ext.cpp
AND c.mutations = ext.mutations
);
Mas agora recebo este erro:
Error at Command Line : 171 Column : 7
Error report -
SQL Error: ORA-00957: duplicate column name
00957. 00000 - "duplicate column name"
A linha 171 é a última linha desta parte
INSERT /*+ ignore_row_on_dupkey_index ( consruct ( construct_id ) ) */
INTO construct
(construct_id,
n_term ,
enz_name,
c_term,
cpp,
mutations,
mw_kda)
O que claramente não é uma coluna duplicada.
Se eu fizer:
INSERT /*+ ignore_row_on_dupkey_index ( consruct ( construct_id ) ) */
INTO construct
(construct_id,
n_term,
enz_name,
c_term,
cpp,
mutations,
mw_kda)
SELECT *
FROM EXTERNAL ((
ext.construct_id NUMBER (10),
ext.n_term VARCHAR2 (50),
ext.enz_name VARCHAR2 (50),
ext.c_term VARCHAR2 (50),
ext.cpp VARCHAR2 (50),
ext.mutations VARCHAR2 (50),
ext.mw_kda NUMBER (7,3))
TYPE ORACLE_LOADER
DEFAULT DIRECTORY data_to_input
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
SKIP 1
BADFILE bad_files:'badflie_insert_into_construct_from_construct.bad'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
MISSING FIELD VALUES ARE NULL
)
LOCATION ('CONSTRUCT.CSV')
REJECT LIMIT UNLIMITED) ext
WHERE NOT EXISTS (
SELECT * FROM construct c
WHERE c.n_term = ext.n_term
AND c.enz_name = ext.enz_name
AND c.c_term = ext.c_term
AND c.cpp = ext.cpp
AND c.mutations = ext.mutations
);
eu recebo
Error at Command Line : 174 Column : 10
Error report -
SQL Error: ORA-00902: invalid datatype
00902. 00000 - "invalid datatype"
A linha 171 éext.construct_id NUMBER (10),
Criei com sucesso uma tabela de registro de erros
BEGIN
DBMS_ERRLOG.create_error_log(
dml_table_name => 'enzyme',
skip_unsupported => TRUE);
END;
/
desc ERR$_ENZYME;
Name Null? Type
--------------- ----- --------------
ORA_ERR_NUMBER$ NUMBER
ORA_ERR_MESG$ VARCHAR2(2000)
ORA_ERR_ROWID$ UROWID
ORA_ERR_OPTYP$ VARCHAR2(2)
ORA_ERR_TAG$ VARCHAR2(2000)
ENZ_NAME VARCHAR2(4000)
Mas recebo um erro quando tento executar esta consulta:
insert /*+ ignore_row_on_dupkey_index ( enzyme ( enz_name ) ) */
into enzyme
SELECT enz_name FROM EXTERNAL ((
construct_id NUMBER(10),
n_term VARCHAR2 (50),
enz_name VARCHAR2 (3),
c_term VARCHAR2 (50),
cpp VARCHAR2 (50),
mutations VARCHAR2 (50),
mw_kda NUMBER (7, 3))
TYPE ORACLE_LOADER
DEFAULT DIRECTORY data_to_input
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
skip 1
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
MISSING FIELD VALUES ARE NULL
)
LOCATION ('CONSTRUCT.CSV')
LOG ERRORS INTO ERR$_ENZYME ('INSERT') REJECT LIMIT UNLIMITED) ext
where not exists (
select * from enzyme e
where e.enz_name = ext.enz_name
);
Error at Command Line : 79 Column : 5
Error report -
SQL Error: ORA-00907: missing right parenthesis
00907. 00000 - "missing right parenthesis"
*Cause:
*Action:
A linha 79 é a linha LOG ERRORS INTO.
Se eu deletar a LOG ERRORS INTO ERR$_ENZYME ('INSERT')
parte, este comando funciona perfeitamente.