【问题标题】:Fetch MULTIPLE ROWS and STORE in 1 VARIABLE - ORACLE STORED PROCEDURE获取多行并存储在 1 个变量中 - ORACLE 存储过程
【发布时间】:2013-06-02 18:18:43
【问题描述】:

我正在研究 ORACLE 存储过程,但我有疑问。 我有一个获取超过 1 行的查询,我想将所有这 3 行的值存储在 1 个变量中。 任何人都可以帮我解决这个问题。

我的查询是这样的:

SELECT STUDENT_NAME FROM STUDENT.STUDENT_DETAILS WHERE CLASS_ID= 'C';

此查询获取 3 个名称

杰克, 吉尔, 兔子

我希望将所有这 3 个名称存储在 1 个变量中,即 C_NAMES。 之后,我将在我的程序的进一步步骤中使用该变量。

谁能帮帮我。

非常感谢您的时间和精力。

提前致谢,

温达 :)

【问题讨论】:

  • 您以后将如何使用这些值?您可以查看引用游标、PL/SQL 表...取决于您希望如何传递和/或引用它们。
  • 我必须在 clob 中使用 C_NAMES 来替换值所有替换代码都完成了我现在只想要 C_NAMES 变量中的所有名称。

标签: oracle variables stored-procedures multirow


【解决方案1】:

你需要一个光标:

DECLARE
    CURSOR stud_cur IS
    SELECT STUDENT_NAME FROM STUDENT.STUDENT_DETAILS WHERE CLASS_ID= 'C';

    l_stud STUDENT.STUDENT_DETAILS%ROWTYPE;
    BEGIN
      OPEN stud_cur;
      LOOP
        FETCH stud_cur INTO l_stud;
        EXIT WHEN stud_cur%NOTFOUND;

        /* The first time, stud_cur.STUDENT_NAME will be Jack, then Jill... */
      END LOOP;
    CLOSE stud_cur;
END;

【讨论】:

  • 嘿,感谢您的及时回复,但我尝试了此代码及其显示--PLS-00302:必须声明组件“STUDENT_DETAILS”--PLS-00320:此表达式类型的声明是不完整或格式错误
【解决方案2】:

根据您的 Oracle 版本 (>= 11G(11.2)),您可以使用 LISTAGG:

SELECT LISTAGG(STUDENT_NAME,',')  WITHIN GROUP (ORDER BY STUDENT_NAME)
FROM STUDENT.STUDENT_DETAILS
WHERE CLASS_ID= 'C';

编辑: 如果你的Oracle版本低于11G(11.2),看看here

【讨论】:

  • 我正在开发 TOAD FOR ORACLE,此代码显示:ORA-00923: FROM keyword not found where expected
  • 为此,我假设您的 Oracle 版本低于 11G。看看我的编辑,我相信这个链接会帮助你。
  • 很奇怪,我执行了完全相同的查询(Student 模式除外),它的工作原理就像魅力一样。结果如下:Bunny,Jack,Jill
  • 哦,我必须输入 Schema 名称,因为我正在从不同的 Schema 执行过程,这就是为什么......请提供其他解决方案
【解决方案3】:
CREATE PROCEDURE a_proc
AS
    CURSOR names_cur IS
        SELECT  student_name
        FROM    student.student_details
        WHERE   class_id = 'C';

    names_t  names_cur%ROWTYPE;
    TYPE names_ntt IS TABLE OF names_t%TYPE; -- must use type
    l_names  names_ntt;
BEGIN
    OPEN  names_cur;
    FETCH names_cur BULK COLLECT INTO l_names;
    CLOSE names_cur;

    FOR indx IN 1..l_names.COUNT LOOP
        DBMS_OUTPUT.PUT_LINE(l_names(indx).student_name);
    END LOOP;
END a_proc;

【讨论】:

  • 我认为有必要在 TYPE names_ntt IS TABLE OF names_t; 之后将 '%TYPE' 添加到 'names_t'
  • 您的代码不是 100% 正确,它给出了我上面的用户所说的错误。您需要使用TYPE names_ntt IS TABLE OF names_cur%ROWTYPE; 并删除names_t names_cur%ROWTYPE;
【解决方案4】:

大家好,感谢您的宝贵时间。 我已经解决了这个问题,感谢 Ederson。

解决办法如下:

SELECT WM_CONCAT(STUDENT_NAME) 
FROM STUDENT.STUDENT_DETAILS WHERE CLASS_ID= 'C';

现在,如果您在存储过程或 PLSQL 中使用它,您只需创建一个变量并使用 SELECT INTO 并打印该变量。

这里是代码

DECLARE

C_NAMES VARCHAR2(100);

BEGIN

   SELECT WM_CONCAT(STUDENT_NAME) INTO C_NAMES
   FROM STUDENT.STUDENT_DETAILS WHERE CLASS_ID= 'C';

  dbms_output.put_line(sname);

END;

再次感谢您的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多