1

即時実行コマンドを使用してテーブルを作成することはお勧めできませんが、実行する前にユーザーに 2 つの情報を要求するテーブルを作成する必要があります。現在私は持っています:

DECLARE
TEST_NAME VARCHAR2(200);  
TEST_VERSION VARCHAR2(200); 
BEGIN
  TEST_NAME := '&1';
  TEST_VERSION := '&2';

EXECUTE IMMEDIATE 'create table TEST_TABLE
(
PROJ_NAME VARCHAR(255) DEFAULT TEST_NAME,
PROJ_VER VARCHAR(255) DEFAULT TEST_VERSION,
COL_1 NUMBER(5)
)';
End;

これはエラーをスローします

Error report:
ORA-00984: column not allowed here
ORA-06512: at line 8
00984. 00000 -  "column not allowed here"
*Cause:    
*Action:

この問題を解決するにはどうすればよいですか? また、2 番目の質問として、別のスクリプトでこのテーブルを作成することに成功した場合、どのように if ステートメントを使用して変数を proj_name 列のデフォルト値 (test_name) と比較しますか?

編集: tbone と Parado のおかげで、最初の問題を解決しましたが、if ステートメントを使用して次のようなことを行う方法を知っている人がいれば:

If test_var = proj_name.default_value ...

行が挿入されていない場合でも、デフォルトの proj_name 値と比較できる必要があります。ありがとう、

4

2 に答える 2

2

この方法を試してください:

DECLARE
TEST_NAME VARCHAR2(200);  
TEST_VERSION VARCHAR2(200); 
BEGIN
  TEST_NAME := '&1';
  TEST_VERSION := '&2';

EXECUTE IMMEDIATE 'create table TEST_TABLE
(
PROJ_NAME VARCHAR(255) DEFAULT '''||TEST_NAME||''',
PROJ_VER VARCHAR(255) DEFAULT  '''||TEST_VERSION||''',
COL_1 NUMBER(5)
)';
End;
于 2013-07-24T19:53:22.390 に答える
1

次のようなことができます。

set serveroutput on

declare
  l_var1 varchar2(100) := 'SOME_VALUE';
  l_sql  varchar2(4000);
begin
  l_sql := 'create table test_tab(
  col1 varchar2(100) default ''' || l_var1 || '''
  )';

  -- show the ddl used
  dbms_output.put_line(l_sql);

  -- create the table
  execute immediate l_sql;

end;

ここでは、l_var1 を 'SOME_VALUE' にハードコーディングしていますが、パラメーターまたはユーザー変数で同じアプローチを使用できます。

于 2013-07-24T20:02:28.443 に答える