2016-06-20 10 views
1

IDを指定した最初の名前を取得するために動的SQLプロシージャを作成しようとしています。動的SQLの入力としてテーブル名を渡す方法はありますか?

CREATE OR REPLACE PROCEDURE SELECT_12 
(
    MIN_NBR NUMBER 
, BORR_FST_NM VARCHAR2 
, FIELD_NAME VARCHAR2 
) IS 
TYPE cur_type IS REF CURSOR; 
C_1 CUR_TYPE; 
QUERY_STR VARCHAR2(1000); 
FIRST_NAME VARCHAR(1000); 
BEGIN 
QUERY_STR:= 'SELECT BORR_FST_NM from MON_DD_DDS.' || field_name ||' 
WHERE MIN_NBR = :MINNBR'; 
    OPEN C_1 FOR QUERY_STR USING MIN_NBR; 
LOOP 
FETCH C_1 INTO FIRST_NAME; 
EXIT WHEN C_1%NOTFOUND; 
DBMS_OUTPUT.PUT_LINE(FIRST_NAME); 
END LOOP; 
NULL; 
END SELECT_12; 

私はブラケット等の学生、教授、学者のような異なる名前が含まれているタイプのMON_DD_DMS.STAGE_MRE_()と異なるデータベースを持っている私はMON_DD_DMS.STAGE_MRE_STUDENTようなテーブルの名前を定義するには、ユーザをしたいと思いますそして、など

私はプロシージャを実行しようMON_DD_DMS.STAGE_MRE_PROFESSOR:

DECLARE 
    MIN_NBR NUMBER; 
    BORR_FST_NM VARCHAR2(200); 
    FIELD_NAME VARCHAR2(200); 
BEGIN 
    FIELD_NAME := &FIELD_NAME; 
    MIN_NBR := &MIN_NBR; 
    BORR_FST_NM := NULL; 

    SELECT_12(MIN_NBR => MIN_NBR, BORR_FST_NM => BORR_FST_NM, 
    FIELD_NAME => FIELD_NAME); 
END; 

はそれがSTAGE_MRE_studentが宣言されなければならないと述べています。

私は何か間違っていますか?どんな助けもありがとう。

+0

' MIN_NBR番号を宣言します。 BORR_FST_NM VARCHAR2(200); FIELD_NAME VARCHAR2(200); BEGIN FIELD_NAME:=&FIELD_NAME; MIN_NBR:=&MIN_NBR; BORR_FST_NM:= NULL; SELECT_12( MIN_NBR => MIN_NBR、 BORR_FST_NM => BORR_FST_NM、 FIELD_NAME => FIELD_NAME )。 END; ' –

+0

私が実行していると私は次のエラーを取得する手順です: –

+0

をフォーマットする必要があり、余分な情報、特にコードを追加する質問を編集してください「識別子の学生が宣言されなければなりません」。 –

答えて

1

エラーは手続きではなく電話からのものと思われます。

FIELD_NAME := &FIELD_NAME; 

ていますが、文字列を代入しているので、あなたは、置換変数の周りの単一引用符持っている必要があります:あなたがやっている、あなたが「ドンOUTパラメータを追加する場合を除き

FIELD_NAME := '&FIELD_NAME'; 

を実際にはローカル変数が必要です。あなたが行うことができます:

BEGIN 
    SELECT_12(MIN_NBR => &MIN_NBR, BORR_FST_NM => NULL, 
    FIELD_NAME => '&FIELD_NAME'); 
END; 

(とあなたが1行にそれを得る、または継続文字を使用することができれば、あなたはその匿名ブロックの省略形としてexecute in SQL*Plus or SQL Developerを使用することができます)

+0

ありがとうございます。私は両方の提案を実装しており、現在は動作しています。 –

関連する問題