2012-04-24 4 views
0

基本となるステートメントの結果を取得しようとしています。 SQL文は問題なく動作します。しかし、結果を印刷するためにrefcursorを使いたいと思います。refcursorで無効なSQL文エラー

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文は何ですか? –

+0

私はSQLクエリの結果を取得します(動的ピボッティングのための有効なSQLクエリ自体です) – Jaanna

+0

それから私は混乱します。 'line'が有効なSQLクエリであれば、あなたのコードは正常に実行されます(以下で説明します)。エラーが発生した場合は、生成しているSQL文が有効でないか、言及していない問題が多いことを意味します。 –

答えて

1

それはあなたのINSERT ALL文がskill_labelname列がvchar2(30)ではなくvarchar2(30)

  • あなたのように定義されてSELECT
  • が欠落している

    • をコンパイルするように、私はあなたのコードを修正した場合匿名ブロックは、language_idのDDLには

    コードはエラーなく実行されます。唯一の問題は、最初の2行を1行にまとめる場合は、ROLE_ID以外のすべての列にMAXを追加し、クエリに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

    +0

    hmmm..whereがコード内に宣言されていますか?(行28から) – Jaanna

    +0

    @ジャーナン - 私の「リーダー」の宣言はあなたのものと同じですが、コピーと貼り付けに最初の行を含めるのを忘れてしまったようですが、それを修正してコードを調整して結果を返します。 –