0

次の SQL*Plus コードがあります。

COLUMN x NEW_VALUE x2
BEGIN
   -- ...
   EXECUTE IMMEDIATE 'SELECT ''a'' x FROM dual';
   EXECUTE IMMEDIATE 'SELECT colname x FROM some_table WHERE (some_condition)';
   -- ...
END;

この時点では、&x2 はまだ空であり、colname は NULL ではありません。他に何もないのに、なぜ「a」に設定されなかったのですか?

4

2 に答える 2

2

COLUMNはSQL*Plusクライアント構成であり、動的SQLはPL/SQLエンジン内で実行されているため、実際の接続はありません。適用されないものをどこに文書化するかわかりません。

これについて私が考えることができる最も近いものは、スクリプトで後で SQL ステートメントを計画するために動的 SQL の結果を利用できるようにするためにこれを行っていると仮定して、代わりにバインド変数を使用することです。

var x varchar2(30);

BEGIN
    EXECUTE IMMEDIATE 'SELECT ''a'' x FROM dual' INTO :x;
END;
/

select :x from dual;

:xを使用していた場所ならどこでも使用できます&x2が、これはバインド変数であるため、使用するときに (varchar の場合) 一重引用符で囲む必要がないことに注意してください。あなたがこれをした場合:

select ':x' from dual;

...次に:x、 ではなく、リテラル文字列を返しますa

編集して追加

特にフォームが必要な場合&は、さらに手順を実行できます (テストされていませんが、理由がわかりません)。

column x2 new_value x3
select :x as x2 from dual;

...そして、あなたは&x3利用可能になります。

于 2012-06-29T19:48:13.043 に答える
0

ウェブ上で何時間ものテストと検索を (無益に) 行った結果、これが私が思いつく最高のものです: 少なくともサポートに関するEXECUTE IMMEDIATE限り、独自のバブル ユニバースで動作します。COLUMNそれはそれを見ることさえありませんし、あなたが何をしようともしません。これがなぜなのか、またはどこにも文書化されていないのか(少なくとも私が見つけることができる)はわかりません。

于 2012-06-29T17:07:34.823 に答える