Oracle PL/SQLで行パラメータから名前付き列を動的にフェッチするにはどうすればよいですか?
-
18-09-2019 - |
質問
次のような手順があります。
PROCEDURE foo(
p_field_name IN VARCHAR2,
p_record IN table%rowtype )
IS
v_value VARCHAR2(100);
BEGIN
EXECUTE IMMEDIATE 'SELECT p_record.' || p_field_name || ' FROM dual' INTO v_value;
END
オラクルはこう訴えている p_record.my_field_name
は無効な識別子であるため、即時実行が他のコンテキストで実行されていると考えられます。
上記でやろうとしていることは可能でしょうか?
解決
EXECUTE IMMEDIATE で行うことは、どのようなコンテキストでも実行できる必要があります。あなたの例は、プロシージャの外では実行できないため、これには当てはまりません。
考えられる回避策の 1 つは、行全体ではなく ID を渡し、テーブルからその 1 つの列を選択することです。ただし、頻繁に使用するとパフォーマンスが低下する可能性があります。
他のヒント
IF / ELSIFと間違って何
IF p_field_name = 'COL1' THEN v_value := p_record.col1
ELSIF p_field_name = 'COL2' THEN v_value := p_record.col2
...
END IF;
あなたはイベントがALL_TAB_COLUMNSからSELECTからそれを生成することができます。それはかなりではないかもしれないが、それは動作します。
私は何をやろうしていることは不可能だと思います。 実行即時注文は、動的SQLの実行です。 SQLのなステートメントはなく、実行時に、あなたは「foo」というプロシージャを作成するときに解析されません。 Oracleの場合それはp_recordを選択」です。 || p_field_name || 「デュアルから」あまりにvarchar型、およびp_recordです。あなたはこのエラーを持っている理由だから、これは説明しています。 解決策は、if / ELSIF / ...のようなものやケース/書くことです。
所属していません StackOverflow