2012-04-24 118 views
0

我想获得底层语句的结果。 SQL语句没有任何问题。但是,为了打印结果,我想使用refcursor。我收到以下错误:无效的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  
+0

如果您在OPEN之前取消注释'dbms_output.put_line',那么它显示的SQL语句是什么? – 2012-04-24 15:46:51

+0

我得到SQL查询的结果(这是一个有效的SQL查询本身的动态透视) – Jaanna 2012-04-24 15:51:55

+0

然后我很困惑。如果'line'是一个有效的SQL查询,您的代码将会成功运行(如下所示)。如果您遇到错误,那意味着您生成的SQL语句无效,或者您没有提到的问题还有更多。 – 2012-04-24 15:55:44

回答

1

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

  • INSERT ALL语句缺少SELECT
  • skill_labelname列被定义为vchar2(30)而非varchar2(30)
  • 你匿名块引用您的DDL不包括的列language_id

该代码无误地运行。如果唯一的问题是您想要将前两行组合到一行中,则只需将MAX添加到除ROLE_ID之外的所有列,并将GROUP BY role_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 
+0

谢谢..我刚刚编辑了我的原始问题,以显示理想的结果。 (顺便说一下,我怎样才能在我的回复中添加代码,因为现在我编辑了我原来的问题,添加了所需结果的行数 – Jaanna 2012-04-25 03:43:24

+0

hmmm..where是在您的代码中声明的“reader”(来自第28行) – Jaanna 2012-04-25 03:51:02

+0

@Jaanna - 我的'reader'声明和你的一样,只是看起来我忘了在复制和粘贴中包含第一行,我修正了这个问题并调整了代码以返回你想要的结果。 – 2012-04-25 14:58:37