2012-03-01 5 views
0
DECLARE 
TYPE t IS RECORD (
col_name VARCHAR2 (100) 
); 

    t_row t; 
    cname VARCHAR (100) := 'col_name'; 
BEGIN 
    t_row.col_name    := 'col'; 
DBMS_OUTPUT.put_line ('out'); 

    IF t_row.cname IS NULL THEN 
    DBMS_OUTPUT.put_line ('in'); 
    END IF; 
END; 

行1でエラー
ORA-06550:行12、列12: PLS-00302
:コンポーネント 'CNAME' が
ORA-06550を宣言する必要があります。行12、列3:
PL/SQL:ステートメントは、私は、レコードの変数を入力する動的な列名を割り当てることができますどのようにダイナミックカラム名

を無視?

+1

...これは奇妙な要件であることを、言わなければなりませんレコードフィールドに名前が付けられていますが、なぜあなたのコードでそれらを使用できないのですか? –

答えて

2

:私はあなたのタイプのTAのスキーマ・オブジェクトを作成します(ただし、基本的に、あなたがする必要はありません - あなたが同様に動的な部分でそれを置くことができる)の例では、単純にするために

create or replace type t is object(col_name varchar2(100)); 
/

その後、このスクリプトを見ることができます:

declare 
    t_row t; 
    cname varchar2(100) := 'col_name'; 
begin 

    t_row := new t('col'); 

    execute immediate 'declare t_in t := :0; begin if t_in.' || cname || 
        ' is null then dbms_output.put_line(''in''); end if; end;' 
    using t_row; 
end; 

けれども、私は、コンパイル時のWHAであなたが知っている

1

エラーがrecord tフィールドcnameを持っていないためであるが、col_name

type t is record (
    col_name varchar2(100) 
); 

一つのコンパイル時にレコードフィールドを知っている必要があります。

はあなたが解決しようとしている本当の問題が何であるかを教えてもらえますか?

あなたは動的SQLを使用したことを行うことができます
+0

ありがとう、実際に私はまた、レコードは、col_nameで使用する必要があることを知っているが、私の状況で私は別のテーブルから列名をフェッチし、この列名を持つレコード値がnullでないかどうかを確認しています。そして、cnameがレコード列名 –

+0

t_row.cnameと同じcol_name値を持っているが、cname自体が値col_nameを持つことがわかっている場合、これはpl/sqlにcnameを動的に入れるための私の要求です –

関連する問題