Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm thế nào để sử dụng nếu tồn tại - nếu không tồn tại trong PL / SQL?

Mã của bạn hầu hết đều tốt, nhưng bạn sẽ phải sửa đổi nó như thế này:

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;      

hoặc như thế này:

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;      

Tùy chọn đầu tiên là sử dụng đúng chính tả Oracle cho các sáng tạo chuỗi và SQL động và tùy chọn thứ hai là tránh hoàn toàn SQL động bằng cách thực thi INSERT tại chỗ (tùy chọn tôi thích hơn).

CHỈNH SỬA: Lỗi bạn gặp phải là do bạn không đóng gói INSERT của mình bên trong một chuỗi. Đó là những gì tôi đã thay đổi cho bạn trong tùy chọn đầu tiên của tôi khi tôi đề cập đến correct Oracle spelling for string creations and dynamic SQL .

Tôi hy vọng tôi đã giúp!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Xem các giao dịch đang mở trong Oracle

  2. Bỏ qua thông số phạm vi ngày trong mệnh đề where khi thông số không được nhập

  3. Fluent NHibernate 3 và Oracle.DataAccess

  4. Oracle:Kết hợp với dấu phân cách, nhưng chỉ khi cả hai toán hạng KHÔNG ĐẦY ĐỦ

  5. truy vấn phụ - đạt điểm cao nhất