我想在Oracle数据库中创建表之前检查表存在的天气。 但是,以下语句不能在第7行(CREATE)上抛出错误ORA-06550。
DECLARE cnt NUMBER;
BEGIN
SELECT COUNT(*) INTO cnt FROM ALL_TABLES WHERE lower(table_name) = lower('TestTable');
IF( cnt = 0 )
THEN
CREATE TABLE TestTable
(
TestFlag NUMBER(1) NOT NULL
);
END IF;
END;
任何人都可以帮我解决这个问题吗?
提前致谢!
答案 0 :(得分:2)
在Oracle中动态创建表是一个很大的禁忌,所以如果这是真正的代码,那么你就停止了。请改用临时表。但失败的原因是DDL必须在SQL中运行,而不是PL / SQL。
DECLARE cnt NUMBER;
BEGIN
SELECT COUNT(*) INTO cnt FROM ALL_TABLES WHERE lower(table_name) = lower('TestTable');
IF( cnt = 0 )
THEN
execute immediate 'CREATE TABLE TestTable (testFlag NUMBER(1) NOT NULL)';
END IF;
END;
答案 1 :(得分:2)
就个人而言,我没有看到任何理由为什么你想以这种方式创建一个表,但是如果它不存在,这是另一种创建表的方法:
SQL> declare
2 table_exists exception;
3 pragma exception_init(table_exists, -955);
4 begin
5 execute immediate 'create table TestTable(TestFlag number(1) not null)';
6 dbms_output.put_line('table created');
7 exception
8 when table_exists
9 then dbms_output.put_line('table exists');
10 end;
11 /
table created
SQL> declare
2 table_exists exception;
3 pragma exception_init(table_exists, -955);
4 begin
5 execute immediate 'create table TestTable(TestFlag number(1) not null)';
6 dbms_output.put_line('table created');
7 exception
8 when table_exists
9 then dbms_output.put_line('table exists');
10 end;
11 /
table exists
PL/SQL procedure successfully completed
答案 2 :(得分:1)
DECLARE cnt NUMBER;
BEGIN
SELECT COUNT(*) INTO cnt FROM ALL_TABLES WHERE lower(table_name)
= lower('TestTable');
IF( cnt = 0 )
THEN
EXECUTE IMMEDIATE 'CREATE TABLE TestTable ( TestFlag NUMBER(1) NOT NULL )';
END IF;
END;