2012-04-24 115 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