如何使用if exists- if not exists in PL/SQL?
How to use if exists- if not exists in PL/SQL?
我正在尝试将 if exists 语句从 SQL-Server 转换为 PL/SQL 但出现错误。
我正在尝试检查 NAME_1
是否存在于我的 table_1
中,如果它们不存在,那么我正在检查 COLUMN_NAME='NAME_2'
是否存在于我的 table_1
中=], 如果存在则
insert (NAME_1 and NAME_2)
变成我的 table_2
。
谢谢
T-SQL(SQL-服务器):
IF NOT (EXISTS (SELECT * from table_name_1 where name='NAME_1'))
BEGIN
IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'table_1' AND COLUMN_NAME='NAME_2'))
EXEC('insert into table_name_1 values (''value1'', (select max(column) from table_2), 20)');
ELSE
EXEC('insert into table_name_1 values (''value1'', (select max(column) from table_2))');
END
PL/SQL(甲骨文):
DECLARE
l_count NUMBER;
l_count_2 NUMBER;
BEGIN
select count(*) into l_count from table_1 where name='NAME_1';
IF l_count = 0 then
BEGIN
select count(*) into l_count_2 FROM dba_tab_cols WHERE TABLE_NAME = 'table_1' AND COLUMN_NAME='NAME_2';
IF l_count_2 > 0 THEN
sql_cnt := INSERT INTO table_1 VALUES ('value1', "select max(column) from table_2" , '20' );
ELSE
sql_cnt:= INSERT INTO table_1 VALUES ('value1', "select max(column) from table_2" );
END IF;
BEGIN
EXECUTE IMMEDIATE sql_cnt ;
END;
END;
END IF;
END;
错误
Error report
ORA-06550: line 11, column 27:
PLS-00103: Encountered the symbol "INSERT" when expecting one of the
(Oracle版前答案及错误信息插入题中)
如您在此处所见:IF-THEN-ELSE Statement,Oracle 的语法不同
IF condition THEN
{...statements to execute when condition is TRUE...}
ELSE
{...statements to execute when condition is FALSE...}
END IF;
即没有 BEGIN ... END
块。相反,语句以 END IF
结尾
您的代码大部分都不错,但您必须像这样修改它:
DECLARE
l_count NUMBER;
l_count_2 NUMBER;
BEGIN
select count(*) into l_count from table_1 where name='NAME_1';
IF l_count = 0 then
BEGIN
select count(*) into l_count_2 FROM dba_tab_cols WHERE TABLE_NAME = 'table_1' AND COLUMN_NAME='NAME_2';
IF l_count_2 > 0 THEN
sql_cnt := 'INSERT INTO table_1 (xycolumn1, xycolumn2, xycolumn3) VALUES (''value1'', ''select max(column) from table_2'', ''20'')';
ELSE
sql_cnt := 'INSERT INTO table_1 (xycolumn1, xycolumn2) VALUES (''value1'', ''select max(column) from table_2'')';
END IF;
BEGIN
EXECUTE IMMEDIATE sql_cnt ;
END;
END;
END IF;
END;
或者像这样:
DECLARE
l_count NUMBER;
l_count_2 NUMBER;
BEGIN
select count(*) into l_count from table_1 where name='NAME_1';
IF l_count = 0 then
BEGIN
select count(*) into l_count_2 FROM dba_tab_cols WHERE TABLE_NAME = 'table_1' AND COLUMN_NAME='NAME_2';
IF l_count_2 > 0 THEN
INSERT INTO table_1 (xycolumn1, xycolumn2, xycolumn3) VALUES ('value1', 'select max(column) from table_2', '20' );
ELSE
INSERT INTO table_1 (xycolumn1, xycolumn2) VALUES ('value1', 'select max(column) from table_2');
END IF;
END;
END IF;
END;
第一个选项是使用正确的 Oracle 拼写来创建字符串和动态 SQL,第二个选项是通过当场执行 INSERT
来完全避免动态 SQL(选项我更喜欢)。
编辑: 你得到的错误是因为你没有将你的 INSERT
封装在一个字符串中。当我提到 correct Oracle spelling for string creations and dynamic SQL
.
时,这就是我在第一个选项中为您更改的内容
希望对您有所帮助!
假设 table_2
没有第三列的 DEFAULT
值,您可以像下面这样简单得多:
DECLARE
l_count NUMBER;
l_count_2 NUMBER;
BEGIN
SELECT COUNT(*) INTO l_count FROM table_1 WHERE NAME='NAME_1';
IF l_count = 0 THEN
SELECT COUNT(*) INTO l_count_2 FROM dba_tab_cols WHERE TABLE_NAME = 'table_1' AND COLUMN_NAME='NAME_2';
INSERT INTO table_1
SELECT 'value1', MAX(column), CASE WHEN l_count_2 > 0 THEN 20 ELSE NULL end
FROM table_2;
END IF;
END;
没有动态的原因SQL。
我正在尝试将 if exists 语句从 SQL-Server 转换为 PL/SQL 但出现错误。
我正在尝试检查 NAME_1
是否存在于我的 table_1
中,如果它们不存在,那么我正在检查 COLUMN_NAME='NAME_2'
是否存在于我的 table_1
中=], 如果存在则
insert (NAME_1 and NAME_2)
变成我的 table_2
。
谢谢
T-SQL(SQL-服务器):
IF NOT (EXISTS (SELECT * from table_name_1 where name='NAME_1'))
BEGIN
IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'table_1' AND COLUMN_NAME='NAME_2'))
EXEC('insert into table_name_1 values (''value1'', (select max(column) from table_2), 20)');
ELSE
EXEC('insert into table_name_1 values (''value1'', (select max(column) from table_2))');
END
PL/SQL(甲骨文):
DECLARE
l_count NUMBER;
l_count_2 NUMBER;
BEGIN
select count(*) into l_count from table_1 where name='NAME_1';
IF l_count = 0 then
BEGIN
select count(*) into l_count_2 FROM dba_tab_cols WHERE TABLE_NAME = 'table_1' AND COLUMN_NAME='NAME_2';
IF l_count_2 > 0 THEN
sql_cnt := INSERT INTO table_1 VALUES ('value1', "select max(column) from table_2" , '20' );
ELSE
sql_cnt:= INSERT INTO table_1 VALUES ('value1', "select max(column) from table_2" );
END IF;
BEGIN
EXECUTE IMMEDIATE sql_cnt ;
END;
END;
END IF;
END;
错误
Error report
ORA-06550: line 11, column 27:
PLS-00103: Encountered the symbol "INSERT" when expecting one of the
(Oracle版前答案及错误信息插入题中)
如您在此处所见:IF-THEN-ELSE Statement,Oracle 的语法不同
IF condition THEN
{...statements to execute when condition is TRUE...}
ELSE
{...statements to execute when condition is FALSE...}
END IF;
即没有 BEGIN ... END
块。相反,语句以 END IF
您的代码大部分都不错,但您必须像这样修改它:
DECLARE
l_count NUMBER;
l_count_2 NUMBER;
BEGIN
select count(*) into l_count from table_1 where name='NAME_1';
IF l_count = 0 then
BEGIN
select count(*) into l_count_2 FROM dba_tab_cols WHERE TABLE_NAME = 'table_1' AND COLUMN_NAME='NAME_2';
IF l_count_2 > 0 THEN
sql_cnt := 'INSERT INTO table_1 (xycolumn1, xycolumn2, xycolumn3) VALUES (''value1'', ''select max(column) from table_2'', ''20'')';
ELSE
sql_cnt := 'INSERT INTO table_1 (xycolumn1, xycolumn2) VALUES (''value1'', ''select max(column) from table_2'')';
END IF;
BEGIN
EXECUTE IMMEDIATE sql_cnt ;
END;
END;
END IF;
END;
或者像这样:
DECLARE
l_count NUMBER;
l_count_2 NUMBER;
BEGIN
select count(*) into l_count from table_1 where name='NAME_1';
IF l_count = 0 then
BEGIN
select count(*) into l_count_2 FROM dba_tab_cols WHERE TABLE_NAME = 'table_1' AND COLUMN_NAME='NAME_2';
IF l_count_2 > 0 THEN
INSERT INTO table_1 (xycolumn1, xycolumn2, xycolumn3) VALUES ('value1', 'select max(column) from table_2', '20' );
ELSE
INSERT INTO table_1 (xycolumn1, xycolumn2) VALUES ('value1', 'select max(column) from table_2');
END IF;
END;
END IF;
END;
第一个选项是使用正确的 Oracle 拼写来创建字符串和动态 SQL,第二个选项是通过当场执行 INSERT
来完全避免动态 SQL(选项我更喜欢)。
编辑: 你得到的错误是因为你没有将你的 INSERT
封装在一个字符串中。当我提到 correct Oracle spelling for string creations and dynamic SQL
.
希望对您有所帮助!
假设 table_2
没有第三列的 DEFAULT
值,您可以像下面这样简单得多:
DECLARE
l_count NUMBER;
l_count_2 NUMBER;
BEGIN
SELECT COUNT(*) INTO l_count FROM table_1 WHERE NAME='NAME_1';
IF l_count = 0 THEN
SELECT COUNT(*) INTO l_count_2 FROM dba_tab_cols WHERE TABLE_NAME = 'table_1' AND COLUMN_NAME='NAME_2';
INSERT INTO table_1
SELECT 'value1', MAX(column), CASE WHEN l_count_2 > 0 THEN 20 ELSE NULL end
FROM table_2;
END IF;
END;
没有动态的原因SQL。