Cum declar și utilizez variabile în PL/SQL ca în T-SQL?

În serverul Sql, de multe ori când testez corpul unei proceduri stocate, copiem corpul în SSMS, DECLARAȚI variabilele din partea de sus a paginii, le setați la unele valori eșantion și executați corpul așa cum este.

De exemplu, dacă este proc

CREATE PROC MySampleProc
    @Name   VARCHAR(20)
AS
    SELECT @Name

Atunci testul meu ar fi

DECLARE @Name VARCHAR(20)
SET     @Name = 'Tom'

    SELECT @Name

Ce este Oracle PL/SQL echivalentă cu asta?

Acesta este cel mai apropiat cu care am venit, dar primesc "PLS-00428: o clauză INTO este așteptată în această instrucțiune SELECT"

DECLARE
   myname varchar2(20);
BEGIN
     myname := 'Tom';

     select myname from DUAL;
END;

Acesta este un exemplu mai bun despre ceea ce încerc cu adevărat să fac:

DECLARE
   myname varchar2(20);
BEGIN
     myname := 'Tom';

     SELECT *
     FROM   Customers
     WHERE  Name = myname;
END;

Dar din nou, vrea un "INTO" când vreau doar înregistrările imprimate pe ecran, nu să fie stocate în alt tabel ....

RESOLVED:

Mulțumită lui @Allan, am lucrat destul de bine. Oracle SQL Developer își amintește aparent valorile parametrilor pe care îi furnizați. PL/SQL Developer, cu toate acestea, nu are nimic de-a face cu acest ....

enter image description here

Dacă executați "Run As Script", acesta va respecta setările implicite, dar va returna rezultatele numai ca text ASCI, nu într-o rețea/foaie de calcul

enter image description here

0
Există două probleme în ultimul tău cod. 1) Nu este nevoie de colon în fața variabilei, nici în atribuire, nici în instrucțiunea SELECT. 2) Rezultatul instrucției SELECT trebuie să meargă undeva, de ex. declarați oa doua variabilă și scrieți SELECT Name INTO Name2 FROM DUAL .
adăugat autor Codo, sursa
Acest lucru nu este posibil (dacă nu utilizați funcții mai avansate). T-SQL și PL/SQL sunt destul de diferite în acest aspect. Dacă doriți să testați o procedură stocată, atunci este posibil să doriți să utilizați DBMS_OUTPUT.PRINT_LINE pentru a scrie rezultatul într-un mod în care majoritatea instrumentelor Oracle (cum ar fi TOAD, SQL Developer, PL/SQL Developer) pot prinde și afișa.
adăugat autor Codo, sursa
Dacă nu vreau ca rezultatele să meargă undeva, vreau doar să se afișeze într-o rețea în PL/SQL Developer?
adăugat autor Tom Halladay, sursa
Acesta este cel mai apropiat răspuns la răspunsul meu, dar nu arată modul în care se utilizează variabila din lista de selecție a interogării și care continuă să-mi arunce erori. plsql-tutorial.com/plsql-variables.htm
adăugat autor Tom Halladay, sursa
@tunmisefasipe, funcționează pentru declarații de selecție multiple? Aveți un exemplu?
adăugat autor Tom Halladay, sursa
M-am luptat cu asta și în trecut. Trebuie să utilizați selectați și să imprimați ieșirea cu dbms_output.put_line (myname); Oracle utilizează cursoare pentru a returna rezultatele, SQL Server nu folosește acest lucru.
adăugat autor codingbiz, sursa

3 răspunsuri

0
adăugat
bine, dacă copiați corpul unei proceduri Oracle, va avea aceeași "constrângere" într-o fereastră dezvoltator de pl-sql 1 ... Deci, va cere să selectați în, sau cursoare ... U au un " adevărat "exemplu de procedură de lucru pe care doriți să o testați?
adăugat autor Raphaël Althaus, sursa
Ce vrei să spui prin a arăta într-un set de rezultate? doriți să selectați valoarea ca o funcție?
adăugat autor rkosegi, sursa
Apoi trebuie să creați funcția în locul procedurii și să SELECT MY_FUNC() FROM DUAL; Funcția poate reveni la setul de rezultate. Vezi actualizarea mea
adăugat autor rkosegi, sursa
Nu, spun că dacă doriți să utilizați codul reutilizabil, trebuie să creați o funcție care să returneze setul de rezultate.
adăugat autor rkosegi, sursa
Poate că nu pun întrebarea corectă. Bazându-vă pe legătura dvs., înțeleg cum să atribuiți valoarea, dar cum o selectez și o arată într-un set de rezultate?
adăugat autor Tom Halladay, sursa
Actualizați coada întrebării cu un exemplu mai bun despre ceea ce încerc să fac/răspundeți la întrebarea dvs. de urmărire.
adăugat autor Tom Halladay, sursa
Vrei să spui că nu există niciun mod de a rula codul de testare care folosește variabilele fără a comite o funcție sau o procedură înapoi în baza de date Oracle?
adăugat autor Tom Halladay, sursa
Ah, vezi că nu vreau codul reutilizabil, asta e punctul meu. Vreau să știu cum să reutilizez corpul a ceea ce a fost o procedură (și a avut parametri) în ceea ce este acum doar o fereastră de 1 PL/SQL Developer, cu variabile definite/atribuite static.
adăugat autor Tom Halladay, sursa

În Oracle PL/SQL, dacă executați o interogare care poate reveni la mai multe rânduri, aveți nevoie de un cursor pentru a repeta rezultatele. Cea mai simplă cale este cu o buclă pentru, de exemplu:

declare
  myname varchar2(20) := 'tom';
begin
  for result_cursor in (select * from mytable where first_name = myname) loop
    dbms_output.put_line(result_cursor.first_name);
    dbms_output.put_line(result_cursor.other_field);
  end loop;
end;

Dacă aveți o interogare care returnează exact un rând, puteți utiliza sintaxa select ... in ... , de exemplu:

declare 
  myname varchar2(20);
begin
  select first_name into myname 
    from mytable 
    where person_id = 123;
end;
0
adăugat

Răspuns revizuit

Dacă nu sunați acest cod dintr-un alt program, o opțiune este să omiteți PL/SQL și să o faceți strict în SQL folosind variabilele de legare:

var myname varchar2(20);

exec :myname := 'Tom';

SELECT *
FROM   Customers
WHERE  Name = :myname;

În multe instrumente (cum ar fi Toad și SQL Developer), omiterea instrucțiunilor var și exec va determina programul să vă solicite valoarea.


Răspuns original

O mare diferență între T-SQL și PL/SQL este faptul că Oracle nu vă permite să returnați implicit rezultatul unei interogări. Rezultatul trebuie întotdeauna returnat în mod explicit într-un mod oarecare. Cea mai simplă cale este să utilizați DBMS_OUTPUT (aproximativ echivalent cu print ) pentru a afișa variabila:

DECLARE
   myname varchar2(20);
BEGIN
     myname := 'Tom';

     dbms_output.print_line(myname);
END;

Acest lucru nu este extrem de util dacă încercați să returnați un set de rezultate. În acest caz, fie veți dori să returnați o colecție sau un reflexor. Cu toate acestea, folosirea oricăreia dintre aceste soluții ar necesita împachetarea codului într-o funcție sau procedură și rularea funcției/procedurii de la ceva care este capabil de a consuma rezultatele. O funcție care a funcționat în acest fel ar putea arăta astfel:

CREATE FUNCTION my_function (myname in varchar2)
     my_refcursor out sys_refcursor
BEGIN
     open my_refcursor for
     SELECT *
     FROM   Customers
     WHERE  Name = myname;

     return my_refcursor;
END my_function;
0
adăugat
Cred că al treilea exemplu este ceea ce caut. Cum aș executa acest lucru în PL/SQL Developer? Dacă folosesc acea sintaxă, primesc "instrucțiune SQL nevalidă" pe linia var? Sau trebuie doar să folosesc Toad?
adăugat autor Tom Halladay, sursa
Am folosit PL/SQL Developer, nu Oracle Developer. Instalat chiar acum, și a determinat parametrii exact așa cum ați descris. Aș dori totuși să știu cum să folosesc parole definite de script, dar acest lucru este destul de bun.
adăugat autor Tom Halladay, sursa
Eu doar primesc doar "ORA-01008: nu toate variabile obligat". Ar trebui să fie difuzat ca un "fereastră SQL" sau un "fereastră de testare" sau o altă fereastră?
adăugat autor Tom Halladay, sursa
În "Toad Run" Ca al doilea buton al mouse-ului -> "Execute Script", astfel încât să nu promt pentru tine de valoare.
adăugat autor Hernaldo Gonzalez, sursa
Exact ce instrument folosiți? Aveam impresia că utilizați SQL Developer gratuit al Oracle, dar asta nu se întâmplă cu ultimul tău comentariu.
adăugat autor Allan, sursa
Am lăsat inițial o colonă din instrucțiunea exec . Cu "colon", dacă "Run Script" ar trebui să funcționeze în SQL Developer, rezultatele vor fi trimise către panoul de ieșire Script, mai degrabă decât grila Rezultatul interogării. Având în vedere experimentarea limitată, singura modalitate prin care am găsit-o în rețea este să omiteți instrucțiunile var și exec și să permiteți SQL Developer să vă solicite o valoare.
adăugat autor Allan, sursa