我知道不建议使用execute immediate命令创建表,但是我需要创建一个表,在表单之前提示用户输入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:
我该如何解决这个问题?另外作为第二个问题,如果我要在另一个脚本中成功创建此表,我将如何使用if语句将变量与proj_name列的默认值(test_name)进行比较?
修改 感谢tbone和Parado我解决了我的第一个问题,但是如果有人可以帮助知道如何使用if语句做这样的事情:
If test_var = proj_name.default_value ...
即使没有插入行,我也需要能够与默认的proj_name值进行比较。 谢谢,
答案 0 :(得分:1)
尝试这种方式:
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;
答案 1 :(得分:0)
您可以这样做:
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',但您可以对参数或用户变量使用相同的方法。