Oracle refcursor的SQL语句错误无效
我试图得到基本陈述的结果。SQL语句的工作没有任何问题。但是,为了打印结果,我想使用refcursor。我得到以下错误: ORA-00900:无效的SQL语句 ORA-01008:并非所有变量都已绑定 ORA-00900:无效的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
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-我对阅读器的声明与你的声明相同。只是我忘记了在复制和粘贴中包含第一行。我修复了这一点,并调整了代码以返回你想要的结果。