2011-03-29 7 views
10

Sono stato in grado di creare una stored procedure per un database Oracle, ma ora non riesco a capire come eseguirlo. Sto usando SQuirrel SQL e questo ha lavorato per creare la procedura:Chiamare una procedura memorizzata Oracle in Squirrel SQL

CREATE OR REPLACE PROCEDURE MyProc(label IN varchar2, results OUT sys_refcursor) AS 
BEGIN 
OPEN results FOR 
    SELECT Label, Count, Timestamp 
     FROM table1 
      LEFT JOIN table2 ON table1.Name=table2.Name 
    WHERE table1.Label=label 
    ORDER BY Timestamp; 
END; 
/

Voglio essere in grado di ottenere e visualizzare il set di risultati. Ho provato a utilizzare call MyProc('param'), ma questo non funziona (errore di numero errato di argomenti). Ho cercato estesamente su questo sito e su altri, ma nulla è stato utile. Per favore aiuto!

+0

@ risposta di dovka sembra essere l'unico che risponde alla domanda. Kayeight non stava chiedendo come chiamare le procedure da Squirrel. Il titolo corrente della domanda, "Chiamare una procedura memorizzata Oracle in Squirrel SQL", è fuorviante. – Lambart

risposta

0
var v_result sys_refcursor 

exec MyProc ('test label',:v_result) 
+0

Non ho SQL * Plus, sto usando Squirrel SQL, quindi questo non funziona. :( – Kayeight

+0

Questa sintassi è specifica per Oracle.Hai installato il plugin Oracle in SQL Squirrel? Http://www.squirrelsql.org/index.php?page=plugins –

+0

Dice che il plugin è installato, ma ottengo un ORA-00900 : errore SQL non valido dell'istruzione ... – Kayeight

3

L'unica sintassi vengo a lavorare a Squirrel SQL è blocco PL/SQL:

declare 
v_label varchar2:='SOMELABEL'; 
TYPE ref_cursor IS REF CURSOR; 
v_cur_results ref_cursor; 
begin 
MyProc (v_label, v_cur_results) 
end; 
/
2

Come this article spiega, usando "chiamata" al posto di "eseguire" dovrebbe risolvere il problema.

+0

Leggi di nuovo la domanda - l'interrogante sapeva già di 'call'. – Lambart

+0

Il collegamento all'articolo è morto –

16

le seguenti opere per eseguire una stored procedure:

begin 
    procedurename; 
end; 
/

Sì, la barra alla fine è necessario!

Il begin...end; dichiara un blocco PL/SQL (specifico per Oracle). La barra è il comando per eseguire il blocco.

/(barra)

esegue il comando SQL eseguito più recentemente o blocco PL/SQL che è memorizzato nel buffer SQL.

[...]

Oracle Database Online Documentation, 10g Release 2 (10.2)/SQL*Plus® User's Guide and Reference

+0

Come funziona questa risposta alla domanda? @ La stored procedure di Kayeight ha due parametri: uno dentro e uno fuori. Quindi come si chiama una stored procedure con un parametro 'out', via Squirrel SQL? Se la sintassi 'begin procedurename; end; /' è superiore a 'call procedurename;', per favore spiega perché. – Lambart

+0

perfect .......... – deFreitas

+0

_ .. è necessario .._ come sono i 2 piuttosto che i 3 punti e virgola! – nsandersen

0

ho lottato con questo per molto tempo, ma sono riuscito a farlo funzionare in questo modo:

{call DBMS_SESSION.SET_CONTEXT (namespace => 'clientcontext', attribute => 'foo', value  => 'bar')}