Oracle
 sql >> база данни >  >> RDS >> Oracle

DDL изрази в PL/SQL?

Предполагам, че правите нещо като следното:

declare
   v_temp varchar2(20);
begin
   execute immediate 'create table temp(name varchar(20))';
   execute immediate 'insert into temp values(''XYZ'')';

   select name into v_name from temp;
end;

По време на компилация таблицата TEMP , не съществува . Все още не е създаден. Тъй като не съществува, не можете да изберете от него; следователно вие също трябва да направите SELECT динамично. Всъщност няма нужда да правите SELECT в конкретно ситуация, но можете да използвате returning into синтаксис.

declare
   v_temp varchar2(20)
begin
   execute immediate 'create table temp(name varchar2(20))';
   execute immediate 'insert into temp 
                      values(''XYZ'')
                      returning name into :1'
                returning into v_temp;
end;

Въпреки това необходимостта от динамично създаване на таблици обикновено е индикация за лошо проектирана схема. Всъщност не би трябвало да е необходимо.

Мога да препоръчам на Рене Нифенегер публикация "Защо динамичният SQL е лош?" поради причини, поради които трябва да избягвате динамичния SQL, ако изобщо е възможно, от гледна точка на производителността. Моля, имайте предвид също, че сте много по-отворени към SQL инжекция и трябва да използва променливи за свързване и DBMS_ASSERT за предпазване от него.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Не може да се СУМИ(TO_NUMBER(поле varchar2)) :ORA 01722 [ORACLE]

  2. Използването на ключовата дума DISTINCT причинява тази грешка:не е ИЗБРАН израз

  3. Как да потвърдите датата ГГГГММДД, дадена като параметър PL/SQL

  4. Javascript дата към sql обект дата

  5. dbms_lob.getlength() срещу length() за намиране на размера на петна в oracle