Executar o procedimento armazenado no programador SQL?
Se eu carregar com o botão direito, os itens do menu são " Order Members By..."e" Create Unit Test " (greyed out). A capacidade de" executar " o procedimento não parece possível quando é acessado pelo Usuário.
Tenho estado a tentar encontrar um exemplo de como criar um bloco anónimo para poder executar o procedimento como ficheiro SQL, mas não encontrei nada que funcione. Alguém sabe como posso executar este procedimento do desenvolvedor SQL? Estou a usar a versão 2.1.1.64. Obrigado antecipadamente!Editar 1:
o procedimento a que quero ligar tem esta assinatura:
user.package.procedure(
p_1 IN NUMBER,
p_2 IN NUMBER,
p_3 OUT VARCHAR2,
p_4 OUT VARCHAR2,
p_5 OUT VARCHAR2,
p_6 OUT NUMBER)
Se escrever o meu bloco anónimo assim:
DECLARE
out1 VARCHAR2(100);
out2 VARCHAR2(100);
out3 VARCHAR2(100);
out4 NUMBER(100);
BEGIN
EXECUTE user.package.procedure (33,89, :out1, :out2, :out3, :out4);
END;
eu entendo o erro:
Bind Varialbe "out1" is NOT DECLCARED
anonymous block completed
tentei inicializar as variáveis:
out1 VARCHAR2(100) := '';
mas obter o mesmo erro:
Editar 2:
Com base na resposta da Alex, tentei remover os colões à frente dos params e ouvir isto:Error starting at line 1 in command:
DECLARE
out1 VARCHAR2(100);
out2 VARCHAR2(100);
out3 VARCHAR2(100);
out4 NUMBER(100);
BEGIN
EXECUTE user.package.procedure (33,89, out1, out2, out3, out4);
END;
Error report:
ORA-06550: line 13, column 17:
PLS-00103: Encountered the symbol "USER" when expecting one of the following:
:= . ( @ % ; immediate
The symbol ":=" was substituted for "USER" to continue.
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
12 answers
Com tipos de parâmetros simples (isto é, não refcursores, etc. você pode fazer algo assim:
SET serveroutput on;
DECLARE
InParam1 number;
InParam2 number;
OutParam1 varchar2(100);
OutParam2 varchar2(100);
OutParam3 varchar2(100);
OutParam4 number;
BEGIN
/* Assign values to IN parameters */
InParam1 := 33;
InParam2 := 89;
/* Call procedure within package, identifying schema if necessary */
schema.package.procedure(InParam1, InParam2,
OutParam1, OutParam2, OutParam3, OutParam4);
/* Display OUT parameters */
dbms_output.put_line('OutParam1: ' || OutParam1);
dbms_output.put_line('OutParam2: ' || OutParam2);
dbms_output.put_line('OutParam3: ' || OutParam3);
dbms_output.put_line('OutParam4: ' || OutParam4);
END;
/
Edited to use the OP's spec, and with an alternative approach to utilise {[[2]} bind variables:
var InParam1 number;
var InParam2 number;
var OutParam1 varchar2(100);
var OutParam2 varchar2(100);
var OutParam3 varchar2(100);
var OutParam4 number;
BEGIN
/* Assign values to IN parameters */
:InParam1 := 33;
:InParam2 := 89;
/* Call procedure within package, identifying schema if necessary */
schema.package.procedure(:InParam1, :InParam2,
:OutParam1, :OutParam2, :OutParam3, :OutParam4);
END;
/
-- Display OUT parameters
print :OutParam1;
print :OutParam2;
print :OutParam3;
print :OutParam4;
Executar fácil. Obter os resultados pode ser difícil.
Dê uma olhada nesta pergunta que eu fiz a melhor maneira / ferramenta para obter os resultados de um procedimento de pacote oracle
O resumo é assim. Assumindo que tinhas um pacote chamado mypackage e procedimento chamado getQuestions. Ele retorna um refcursor e toma o nome de usuário string.Tudo o que tem de fazer é criar um novo ficheiro SQL (Ficheiro Novo). Configure a ligação e cole no seguinte e executar.
var r refcursor;
exec mypackage.getquestions(:r, 'OMG Ponies');
print r;
Para aqueles que utilizam o desenvolvimento SQL 3+, no caso de não terem visto isso:
O desenvolvedor de SQL tem uma funcionalidade para executar directamente a proc / função armazenada, e a saída é mostrada de uma forma fácil de ler.
Basta clicar sobre o pacote armazenado/proc/ função armazenada, Clique em Run
e escolha {a[1]} para ser o proc./func você deseja executar, SqlDeveloper irá gerar o fragmento de código a executar (de modo que você pode colocar seus parâmetros de entrada). Uma vez executados, os parâmetros de saída são mostrados em metade inferior da janela, e até tem suporte incorporado para o cursor de ref: o resultado do cursor será mostrado como uma página de saída separada.
Abra o procedimento no programador SQL e execute-o a partir daí. O programador SQL mostra o SQL que ele executa.
BEGIN
PROCEEDURE_NAME_HERE();
END;
Utilizar:
BEGIN
PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...);
END;
Substituir "PACKAGE_NAME", "PROCEDURE_NAME" e "parameter_value" pelo que necessita. Os parâmetros de saída terão de ser declarados antes de.
SET serveroutput on;
DECLARE
testvar varchar(100);
BEGIN
testvar := 'dude';
schema.MY_PROC(testvar);
dbms_output.enable;
dbms_output.put_line(testvar);
END;
E então você teria que ir verificar a tabela para o que quer que seu proc era suposto fazer com aquela variável passada-in -- a saída irá apenas confirmar que a variável recebeu o valor (e teoricamente, passou-o para o proc).
Nota (diferenças entre as minhas e as outras):
- não
:
antes da variável Nome - Não colocar
.package.
ou.packages.
entre o nome do esquema e o nome do procedimento - não é preciso colocar um
&
no valor da variável. - não usar
print
em lado nenhum - não utilizar
var
para declarar a variável
Não acredito, isto não vai ser executado no programador SQL:
var r refcursor;
exec PCK.SOME_SP(:r,
'02619857');
print r;
Mas isto irá:
var r refcursor;
exec TAPI_OVLASCENJA.ARH_SELECT_NAKON_PRESTANKA_REG(:r, '02619857');
print r;
Obviamente, tudo tem de estar numa linha..
Usando a versão 4.0.2.15 do programador SQL Build 15.21 as seguintes obras:
SET SERVEROUTPUT ON
var InParam1 varchar2(100)
var InParam2 varchar2(100)
var InParam3 varchar2(100)
var OutParam1 varchar2(100)
BEGIN
/* Assign values to IN parameters */
:InParam1 := 'one';
:InParam2 := 'two';
:InParam3 := 'three';
/* Call procedure within package, identifying schema if necessary */
schema.package.procedure(:InParam1, :InParam2, :InParam3, :OutParam1);
dbms_output.enable;
dbms_output.put_line('OutParam1: ' || :OutParam1);
END;
/
Embora esta questão seja bastante antiga, continuo a tropeçar no mesmo resultado sem encontrar uma maneira fácil de correr do desenvolvedor sql. Depois de algumas tentativas, eu encontrei uma maneira fácil de executar o procedimento armazenado do desenvolvedor sql em si.
Em pacotes, selecione o pacote desejado e clique com o botão direito no nome do pacote (não no nome do procedimento armazenado).
Você vai encontrar uma opção para correr. Selecione isso e forneça os argumentos necessários. Clique em OK e você pode ver o resultado na secção das variáveis de saída abaixo
Estou a usar a versão de desenvolvimento SQL 4.1.3.20
SET serveroutput on;
DECLARE
var InParam1 number;
var InParam2 number;
var OutParam1 varchar2(100);
var OutParam2 varchar2(100);
var OutParam3 varchar2(100);
var OutParam4 number;
BEGIN
/* Assign values to IN parameters */
InParam1 := 33;
InParam2 := 89;
/* Call procedure within package, identifying schema if necessary */
schema.package.procedure(InParam1, InParam2,
OutParam1, OutParam2, OutParam3, OutParam4);
/* Display OUT parameters */
dbms_output.put_line('OutParam1: ' || OutParam1);
dbms_output.put_line('OutParam2: ' || OutParam2);
dbms_output.put_line('OutParam3: ' || OutParam3);
dbms_output.put_line('OutParam4: ' || OutParam4);
END;
var out_para_name refcursor;
execute package_name.procedure_name(inpu_para_val1,input_para_val2,... ,:out_para_name);
print :out_para_name;