Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle refcursor的SQL语句错误无效_Oracle_Plsql_Oracle11g_Oracle9i_Plsqldeveloper - Fatal编程技术网

Oracle refcursor的SQL语句错误无效

Oracle refcursor的SQL语句错误无效,oracle,plsql,oracle11g,oracle9i,plsqldeveloper,Oracle,Plsql,Oracle11g,Oracle9i,Plsqldeveloper,我试图得到基本陈述的结果。SQL语句的工作没有任何问题。但是,为了打印结果,我想使用refcursor。我得到以下错误: ORA-00900:无效的SQL语句 ORA-01008:并非所有变量都已绑定 ORA-00900:无效的SQL语句 VARIABLE reader refcursor; DECLARE line varchar2(32767); BEGIN line := 'SELECT role_id,'; FOR n IN (SELECT name

我试图得到基本陈述的结果。SQL语句的工作没有任何问题。但是,为了打印结果,我想使用refcursor。我得到以下错误:

ORA-00900:无效的SQL语句 ORA-01008:并非所有变量都已绑定 ORA-00900:无效的SQL语句

VARIABLE reader refcursor;
DECLARE
  line varchar2(32767);
BEGIN
  line := 'SELECT role_id,';
  FOR n IN (SELECT name
              FROM (SELECT competence.skill_role.role_id,
                           competence.skill_label.name,
                           competence.skill_role.target_value
                      FROM competence.skill_role,
                           competence.skill_label
                     WHERE competence.skill_label.skill_id =
                           competence.skill_role.skill_id
                       AND competence.skill_label.language_id = 1)
                       matrix_result ) LOOP
    line := line || '(decode(name,''' || n.name ||
            ''',target_value)) "' || n.name || '",';
  END LOOP;
  line := RTRIM(line, ',') ||
    ' FROM (SELECT competence.skill_role.role_id,
                   competence.skill_label.name,
                   competence.skill_role.target_value
              FROM competence.skill_role, competence.skill_label
             WHERE competence.skill_label.skill_id =
                   competence.skill_role.skill_id
               AND competence.skill_label.language_id = 1) matrix_result';
--dbms_output.put_line(line);
--execute immediate line;
 OPEN :reader FOR line;
END;
/
PRINT :reader;
表数据

CREATE TABLE competence.skill_role
  (skill_id  NUMBER,
   role_id NUMBER,
   target_value NUMBER)
/
INSERT ALL 
INTO competence.skill_role VALUES (3432030, 1421866, 2)
INTO competence.skill_role VALUES (3434962, 1421866, 2)
INTO competence.skill_role VALUES (3488025, 3488804, 4)


SELECT * FROM competence.skill_role

SKILL_ID ROLE_ID     target_value
---------- -------   -----------
3432030 1421866       2
3434962 1421866       2
3488025 3488804       4


CREATE TABLE competence.skill_label
  (skill_id  NUMBER,
   name vchar2 (30))
/
INSERT ALL 
INTO competence.skill_label VALUES (3432030, 'Alueen projektipätevyys')
INTO competence.skill_label VALUES (3434962, 'Moottorin koekäyttö')
INTO competence.skill_label VALUES (3488025, 'Etähallintajärjestelmät')


SELECT * FROM arc_competence.skill_label

SKILL_ID NAME
---------- -------
3432030, Alueen projektipätevyys
3434962, Moottorin koekäyttö
3488025, Etähallintajärjestelmät
我想从第一个查询得到以下结果。从您的答案(如果我理解正确的话)来看,似乎我需要手动运行结果查询来获得答案。我希望在不运行结果查询的情况下得到结果:-)我目前没有访问客户机的权限,但我现在要去那里

ROLE_ID     Alueen projektipätevyys  Moottorin koekäyttö    Etähallintajärjestelmät          
1421866          2                      2
3488804                                                            4       

如果我纠正你的代码,让它编译

  • 您的
    INSERT ALL
    语句缺少
    SELECT
  • skill\u标签中的
    name
    列定义为
    vchar2(30)
    而不是
    varchar2(30)
  • 匿名块引用DDL不包含的列
    language\u id
代码运行时没有错误。如果唯一的问题是要将前两行合并为一行,则只需将
MAX
添加到除
ROLE\u ID
之外的所有列中,并将
groupby ROLE\u ID
添加到查询中

SQL> ed
Wrote file afiedt.buf

  1  CREATE TABLE skill_role
  2    (skill_id  NUMBER,
  3     role_id NUMBER,
  4*    target_value NUMBER)
SQL> /

Table created.

SQL> ed
Wrote file afiedt.buf

  1  INSERT ALL
  2  INTO skill_role VALUES (3432030, 1421866, 2)
  3  INTO skill_role VALUES (3434962, 1421866, 2)
  4  INTO skill_role VALUES (3488025, 3488804, 4)
  5* select * from dual
SQL> /

3 rows created.


SQL> ed
Wrote file afiedt.buf

  1  CREATE TABLE skill_label
  2    (skill_id  NUMBER,
  3*    name varchar2 (30))
SQL> /

Table created.

SQL> ed
Wrote file afiedt.buf

  1  INSERT ALL
  2  INTO skill_label VALUES (3432030, 'Alueen projektipΣtevyys')
  3  INTO skill_label VALUES (3434962, 'Moottorin koekΣytt÷')
  4  INTO skill_label VALUES (3488025, 'EtΣhallintajΣrjestelmΣt')
  5* select * from dual
SQL> /

3 rows created.

SQL> commit;

Commit complete.

SQL> variable reader refcursor;

SQL> ed
Wrote file afiedt.buf

  1  DECLARE
  2    line varchar2(32767);
  3  BEGIN
  4    line := 'SELECT role_id,';
  5    FOR n IN (SELECT name
  6                FROM (SELECT skill_role.role_id,
  7                             skill_label.name,
  8                             skill_role.target_value
  9                        FROM skill_role,
 10                             skill_label
 11                       WHERE skill_label.skill_id =
 12                             skill_role.skill_id
 13                         )
 14                         matrix_result ) LOOP
 15      line := line || 'max(decode(name,''' || n.name ||
 16              ''',target_value)) "' || n.name || '",';
 17    END LOOP;
 18    line := RTRIM(line, ',') ||
 19      ' FROM (SELECT skill_role.role_id,
 20                     skill_label.name,
 21                     skill_role.target_value
 22                FROM skill_role, skill_label
 23               WHERE skill_label.skill_id =
 24                     skill_role.skill_id
 25                 ) matrix_result ' ||
 26       ' GROUP BY role_id' ;
 27    dbms_output.put_line(line);
 28    --execute immediate line;
 29    OPEN :reader FOR line;
 30* END;
 31  /

PL/SQL procedure successfully completed.

SQL> print reader

   ROLE_ID Alueen projektipΣtevyys Moottorin koekΣytt÷ EtΣhallintajΣrjestelmΣt
---------- ----------------------- ------------------- -----------------------
   1421866                       2                   2
   3488804                                                                   4

如果取消对
dbms\u输出的注释。在
OPEN
之前放置\u line
调用,它显示的SQL语句是什么?我得到了SQL查询的结果(这本身就是用于动态数据透视的有效SQL查询),那么我会感到困惑。如果
line
是一个有效的SQL查询,那么代码将成功运行(如下所示)。如果您遇到错误,这意味着您生成的SQL语句无效,或者您没有提到问题的更多方面。谢谢..我刚刚编辑了我的原始问题,以便显示所需的结果。(顺便问一下,我如何在我的回答中添加代码,因为现在我编辑了我的原始问题以添加行以获得所需的结果。嗯……代码中声明的“reader”在哪里?(来自第28行)@Jaanna-我对
阅读器的声明与你的声明相同。只是我忘记了在复制和粘贴中包含第一行。我修复了这一点,并调整了代码以返回你想要的结果。