2016-06-10 15 views
0

Hallo Ich habe eine Prozedur, die ein Recordset mit Cursor in der Ausgabe zurückgeben, was ich zu tun versuche, ich benutze Cursor, um die Daten zu erhalten und müssen sie an den Cursor ausgeben. Ich kann tun, wie untenRückgabewert zum Cursor plsql

PROCEDURE test(value_one IN someTabel.somecolumn%TYPE,        
      valu_two IN someTabel.somecolumn%TYPE, 
      Outputcursor OUT SYS_REFCURSOR) IS 
mydeclaration goes here 
output_value_one sometable.somecolumn%Type; 
--- 
cursor test_select is 
select statement 
begin 
for val in test_select loop 
fetch test_select into output_value_one; -- I want my cursor outputcursor to  be return instead of output_value_one 
end loop; 
end; 
+0

Diese Frage zur Zeit keinen Sinn machen. Sie haben kein Beispiel für die Auswahl, die für den Cursor test_select verwendet wird, und Sie zeigen auch nicht, wie er sich auf den Ausgangskurs bezieht. Ich vermute, dass Sie einen ref-Cursor zurückgeben möchten, der entweder den Cursor test_select selbst oder eine Verknüpfung zur Auswahlabfrage des Cursors test_select enthält. Bitte aktualisieren Sie Ihre Frage, um genauer zu sein und wir können Ihnen dann vielleicht helfen. – Boneist

Antwort

1

Sie senden die Deptno der Cursor die Abfrage zurück, wo Sie von Frontend aus behandeln können.

create or replace Procedure Transproc(p_deptno IN emp.deptno%TYPE, 
         Outputcursor Out Sys_Refcursor, 
         p_recordset Out Varchar) 
      Is 
      Vquery varchar2(200); 
      Begin 
      Vquery:='select * from emp where deptno='|| p_deptno ||''; 

      Open Outputcursor For Vquery; 
      OMessage:='Success'; 
      Exception 
      When others then 
      OMessage:='Fail'; 
      End; 

ODER versuchen Sie unten eins nach Ihrer Anforderung.

CREATE OR REPLACE PROCEDURE get_emp_rs (p_deptno IN emp.deptno%TYPE, 
         p_recordset OUT SYS_REFCURSOR) AS 
BEGIN 
    OPEN p_recordset FOR 
    SELECT ename, 
      empno, 
      deptno 
    FROM emp 
    WHERE deptno = p_deptno 
    ORDER BY ename; 
END GetEmpRS; 
/

zu testen: -

SET SERVEROUTPUT ON SIZE 1000000 
DECLARE 
    l_cursor SYS_REFCURSOR; 
    l_ename emp.ename%TYPE; 
    l_empno emp.empno%TYPE; 
    l_deptno emp.deptno%TYPE; 
BEGIN 
    get_emp_rs (p_deptno => 30, 
       p_recordset => l_cursor); 

    LOOP 
    FETCH l_cursor 
    INTO l_ename, l_empno, l_deptno; 
    EXIT WHEN l_cursor%NOTFOUND; 
    DBMS_OUTPUT.PUT_LINE(l_ename || ' | ' || l_empno || ' | ' || l_deptno); 
    END LOOP; 
    CLOSE l_cursor; 
End; 
/
+0

Es ist besser bind Variable zu verwenden: Vquery: = 'select * from emp wo deptno =: p_dept'; und dann Open Outputcursor for Vquery mit p_deptno; – ksa

+0

Hallo danke für die Antwort dazu beigetragen – Kamila