2016-08-05 11 views
1

DBMS_SQLの新機能です。カーソルから1行目を取得しようとしていますが、何も表示されません。私が間違ったことは?ここでは、コードです:PL/SQLでは、DBMS_SQLはデータを表示できません。

CREATE OR REPLACE PROCEDURE TEST_SQL 
IS 
    id_var    NUMBER; 
    name_var   VARCHAR2(30); 
    sal_var  Number; 
    source_cursor  INTEGER; 
    countp    INTEGER; 
    BEGIN 


    source_cursor := dbms_sql.open_cursor; 
    DBMS_SQL.PARSE(source_cursor, 
     'SELECT employee_id, first_name, salary FROM employees where department_id = 50', 
      DBMS_SQL.NATIVE); 
    DBMS_SQL.DEFINE_COLUMN(source_cursor, 1, id_var); 
    DBMS_SQL.DEFINE_COLUMN(source_cursor, 2, name_var, 30); 
    DBMS_SQL.DEFINE_COLUMN(source_cursor, 3, sal_var); 
    countp := DBMS_SQL.EXECUTE(source_cursor); 


    DBMS_SQL.COLUMN_VALUE(source_cursor, 1, id_var); 
     DBMS_SQL.COLUMN_VALUE(source_cursor, 2, name_var); 
     DBMS_SQL.COLUMN_VALUE(source_cursor, 3, sal_var); 

dbms_output.put_line('id_var: '||id_var ||', name_var: '||name_var ||', sal_var: '|| sal_var); 


    END; 
/

、出力は次のとおりです。

PROCEDURE TEST_SQL compiled 
anonymous block completed 
id_var: , name_var: , sal_var: 

EDIT:学校の間違い - FETCH_ROWSについて-.- すべての作品を忘れてしまいました!

+0

答えが更新されました。出力は上記のとおりです。 Oracle Database 11g Express Editionリリース11.2.0.2.0 - 64ビット –

+0

奇妙な疑問があります。テーブルにdepartment_id = 50のレコードがありますか。また、単純なカーソルを使用して簡単に行うことができるときに表示するために、Oracle定義の関数を使用しています。 – XING

+0

トレーニング用です。はい、レコードが存在します。そのHRスキーマ。 –

答えて

1

あなたはfetchingのデータではありません。あなたは何をする必要があります。

CREATE OR REPLACE PROCEDURE TEST_SQL 
IS 
    id_var    NUMBER; 
    name_var   VARCHAR2(30); 
    sal_var  Number; 
    source_cursor  INTEGER; 
    countp    INTEGER; 
    BEGIN 

    source_cursor := dbms_sql.open_cursor; 
    DBMS_SQL.PARSE(source_cursor, 
     'SELECT employee_id, first_name, salary FROM employees where department_id = 50', 
      DBMS_SQL.NATIVE); 
    DBMS_SQL.DEFINE_COLUMN(source_cursor, 1, id_var); 
    DBMS_SQL.DEFINE_COLUMN(source_cursor, 2, name_var, 30); 
    DBMS_SQL.DEFINE_COLUMN(source_cursor, 3, sal_var); 
    countp := DBMS_SQL.EXECUTE(source_cursor); 

    countp := DBMS_SQL.FETCH_ROWS(source_cursor); 

    DBMS_SQL.COLUMN_VALUE(source_cursor, 1, id_var); 
    DBMS_SQL.COLUMN_VALUE(source_cursor, 2, name_var); 
    DBMS_SQL.COLUMN_VALUE(source_cursor, 3, sal_var); 

    dbms_output.put_line('id_var: '||id_var ||', name_var: '||name_var ||', sal_var: '|| sal_var); 

    END; 
/

set serveroutput on 
exec test_sql; 

PL/SQL procedure successfully completed. 

id_var: 120, name_var: Matthew, sal_var: 8000 

するか、トニー・アンドリュースが指摘したように、EXECUTE_AND_FETCHで2つのステップを組み合わせる:

DBMS_SQL.FETCH_ROWS(source_cursor); 

は、これは動作します。

もちろん、フェッチをループで実行することは、クエリによって返された最初の行だけをフェッチして表示するためです。

+1

私は同様にポストしようとしていましたが、代替のDBMS_SQL.EXECUTE_AND_FETCHを言います。 +1、我々はもはや言いたくない。 –

+0

アレックス - はい、私はすでに解決しています。私は自分の投稿を編集しました。しかし、ありがとう! –

関連する問題