2017-07-26 3 views
-1

1.dept (Stammtisch) -deptno dname lockönnen wir verwenden% rowtype für zwei Tabellen mit Joinbedingung

2.emp (Kinder Tabelle) -empno ename sal deptno

* Anzeige ename , loc, während wir empno mit% roadtype angeben.

* Dieses plsql-Programm verwenden, um Ergebnisse zu erzielen.

 
DECLARE 
v1 emp%rowtype;
v2 dept1%rowtype;
vnum emp.empno%type:='&no';
BEGIN
SELECT A.ename,b.loc
INTO v1,v2
FROM emp A,dept1 b
WHERE A.deptno=b.deptno AND A.empno=vnum;
dbms_output.put_line(v1.ename||'**'||v2.loc);
end;
+0

Nein, es ist nicht möglich. Aber Sie können den Cursor aus Ihrer Abfrage deklarieren und den Cursor% roadtype verwenden. –

+0

sir cursor kann mehr Zeilen zurückgeben ..... hier gebe ich nur eine Zeile zurück, während wir empno vom Benutzer geben ...... so gibt es nur eine Zeile zurück –

+0

Sie können einen expliziten Cursor erstellen, der formale Parameter hat, und dann Übergeben Sie bei jedem Öffnen des Cursors verschiedene Aktualparameter an den Cursor. In Ihrem Fall können Sie "empno" an Ihren Cursor übergeben, um die Unterstreichungsabfrage auf nur einen Datensatz zu beschränken. Empfehlen Sie Oracle Dokumentation zu folgen – Himanshujaggi

Antwort

0

Warum Rowtype verwenden, wenn alles, was Sie auswählen, einzelne Spalten sind? Sie können die Variablen über den Spaltentyp deklarieren.

DECLARE 
v1 emp.ename%type; 
v2 dept1.loc%type; 
vnum emp.empno%type:='&no'; 
BEGIN 
    SELECT A.ename, 
     b.loc 
    INTO v1, 
     v2 
    FROM emp A, 
     dept1 b 
    WHERE A.deptno=b.deptno 
    AND A.empno =vnum; 
    dbms_output.put_line(v1.ename||'**'||v2.loc); 
END; 
0

Wir können einen benutzerdefinierten Datensatztyp definieren, der der Projektion einer bestimmten Abfrage in PL/SQL entspricht. Ein Vorteil davon ist die Möglichkeit, einen Tabellentyp aus dem Datensatztyp zu definieren, der für das Abrufen mehrerer Datensätze nützlich ist.

DECLARE 
    type v_rec_t is record (
     ename emp.ename%type 
     , loc dept1.loc%type 
    ); 
    l_rec v_rec_t; 

    type v_rec_nt is table of v_rec_t; 
    l_recs v_rec_nt; 

BEGIN 

    SELECT A.ename, b.loc 
    INTO l_rec 
    FROM emp A, dept1 b 
    WHERE A.deptno = b.deptno 
    AND A.empno = &empno; 

    dbms_output.put_line(l_rec.ename ||'**'|| l_rec.loc); 

    -- get multiple rows 
    SELECT A.ename, b.loc 
    bulk collect INTO l_recs 
    FROM emp A 
     join dept1 b 
     on A.deptno = b.deptno 
    where A.deptno = &deptno; 


    dbms_output.put_line(' emps in dept'|| l_recs.count()); 

end; 

Einer der Gründe explizite Cursor zu definieren ist, dass wir eine Aufzeichnung Variable auf der Basis ihrer Projektion zu definieren:

declare 
    cursor c_emploc (p_empid emp.empno%type) is 
     SELECT A.ename, b.loc 
     FROM emp A, dept1 b 
     WHERE A.deptno = b.deptno 
     AND A.empno = p_empid; 
    r_emploc c_emploc%rowtype; 
    .... 
+0

THNKS BRO ....... –

+0

@pandiyanram - wenn Sie diese Antwort hilfreich gefunden haben, bitte upvote oder akzeptieren Sie es. Akzeptierte Antworten machen StackOverflow zu einer besseren Ressource für zukünftige Suchende. – APC

+1

@pandiyanram Es ist eine soziale Verantwortung für jeden auf SO, andere/neue Tischler über SO Etikette zu erziehen, also bitte lesen Sie dies und handeln Sie entsprechend http://stackoverflow.com/help/someone-answers – XING

Verwandte Themen