【问题标题】:Return multiple rows in a plqsl stored procedure in output parameters在输出参数中返回 plqsl 存储过程中的多行
【发布时间】:2017-03-21 10:28:13
【问题描述】:

我必须编写一个 PL/SQL 存储过程来从数据库中的选定表中提取所有行 我尝试过这样的事情:

    create or replace PROCEDURE ANAGRAFICA_GET (
ID_O OUT NUMBER
NOME_O OUT VARCHAR2(25),
COGNOME_O OUT VARCHAR2(25),
DATA_NASCITA_O OUT VARCHAR2(25),
CITTA_NASCITA_O VARCHAR2(25),
GENERE_O OUT VARCHAR2(25),
OCCUPAZIONE_O OUT VARCHAR2(25)
)
AS
  CURSOR RESULTS IS
  SELECT ID,NOME,COGNOME,DATA_NASCITA,CITTA_NASCITA,GENERE,OCCUPAZIONE
  FROM TAB_ANAGRAFICA;
  ESTRAZIONE TAB_ANAGRAFICA%ROWTYPE;
  LAST_ID INT;
  FIRST_ID INT;
BEGIN
  SELECT ID
     INTO LAST_ID
     FROM TAB_ANAGRAFICA
     WHERE ROWNUM <=1
     ORDER BY ID DESC;
  SELECT ID
     INTO FIRST_ID
     FROM TAB_ANAGRAFICA
     WHERE ROWNUM <=1
     ORDER BY ID ASC;
  OPEN RESULTS;
     FOR i IN FIRST_ID .. LAST_ID LOOP
       FETCH RESULTS INTO ESTRAZIONE;
       ID_O := ESTRAZIONE.ID;
       NOME_O := ESTRAZIONE.NOME;
       COGNOME_O := ESTRAZIONE.COGNOME;
       DATA_NASCITA_O := ESTRAZIONE.DATA_NASCITA;
       CITTA_NASCITA_O := ESTRAZIONE.CITTA_NASCITA;
       GENERE_O := ESTRAZIONE.GENERE;
       OCCUPAZIONE_O := ESTRAZIONE.OCCUPAZIONE;
     END LOOP;
  CLOSE RESULTS;
END;

但是当我运行存储过程时,我只能看到输出变量的最后一行;相反,如果我在运行过程时尝试在循环中编写 dbms_outputline 命令,我可以看到它能够获取所有数据。 我怎么解决这个问题 ?如何在输出变量部分获得结果集而不是单个记录? 谢谢大家 马可

【问题讨论】:

    标签: plsql


    【解决方案1】:

    存储过程只给出声明中标记为out的参数。您实际上所做的是打开游标,循环遍历它,每次都分配给这些参数,但只有在存储过程结束时才会传递这些参数。

    您想要做的只是将光标作为参数:

    create or replace PROCEDURE ANAGRAFICA_GET (
        PASSED_CURSOR OUT SYS_REFCURSOR,
    ) AS
    BEGIN
            OPEN PASSED_CURSOR FOR
                SELECT X, Y, Z FROM EXAMPLE_TABLE;
    END
    

    【讨论】:

    • 如果我想将所有值返回到游标中,这很好用......但我需要分别使用整个名称列表、整个 cogmome 列表等,即 Root -NOME ( list) -COGNOME (list) -.... 因为我需要在外部环境中使用所有这些列表
    • 我认为这是因为我在循环外输出了变量
    • 我不明白你的意思。这样您就可以将光标传递给您的外部环境。然后外部环境可以循环访问并使用您需要的所有值访问每条记录。
    • 输出仅在存储过程结束时传递。不是在每次迭代中。没有任何外部环境会比您定义的参数更多。
    • 谢谢,我解决了我的问题。我在外部环境中处理了 XML 结果字符串,获得了所有需要的记录。太好了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 2016-10-30
    • 1970-01-01
    • 2019-07-12
    • 2012-12-24
    相关资源
    最近更新 更多