создание таблицы в pl / sql - PullRequest
0 голосов
/ 04 ноября 2010

Я хочу объединить скрипт sql, который создает таблицу, и скрипт pl / sql, который вставляет данные в эту таблицу. Пожелания клиента

Моя идея состояла в том, чтобы создать таблицу в pl sql. Но это не работает. Создание запрещено в начальной части. Решение, которое я видел, состоит в том, чтобы сделать это в операторе немедленного выполнения. На практике я пробовал это:

    SET serveroutput ON
    spool 03_CREATE_CATEGORIEDECL.log

    BEGIN
     execute immediate 'create table CATEGORIEDECLARATION ( 
     nIdCategorieDeclaration  NUMBER(10)   not null,
     ...
     constraint PK_CATDECLA primary key (nIdCategorieDeclaration)
    )';

select c.nidcalendrier into millesime from calendrier c where c.smillesime = '2010';

-- Lignes relatives au formulaire CA3
INSERT into CATEGORIEDECLARATION (nIdCategorieDeclaration,nIdTypeFormulaire,sLibelle,sType,sAide,sTexte,sTexte2,sTypeAffichage,bAffichage,sInterval,nIdCalendrier) 
values (seq_CATEGORIEDECLARATION.nextval,'5','Autres cas  (zone de saisie libre)', 'SOMME_A_DEDUIRE','','',NULL,'CAT_AUTRE_CAS', 1, 'POSITIF',millesime);

COMMIT;
    END; 
    /
    spool off

Я получил сообщение об ошибке в конце ключевого слова, оно не ожидалось. Итак, мой вопрос, как создать таблицу в сценарии pl / sql? Нужно ли хранить эти 2 действия в двух разных скриптах?

Ответы [ 2 ]

4 голосов
/ 04 ноября 2010

У вас есть 2 синтаксические ошибки, обе относительно точки с запятой.Попробуйте это:

BEGIN
 execute immediate 'create table CATEGORIEDECLARATION (
 nIdCategorieDeclaration  NUMBER(10)   not null,
 ...
 constraint PK_CATDECLA primary key (nIdCategorieDeclaration)
)';
END;
/
3 голосов
/ 04 ноября 2010

Перед проверкой фрагментов, пожалуйста, имейте в виду, что на момент написания этой статьи у меня не было доступа к базе данных Oracle, чтобы проверить их каким-либо образом.Все, что следует, записано из памяти.

Я предполагаю, что вы используете sqlplus для запуска ваших скриптов.Разве вы не можете просто поместить оператор create и блок PL / SQL в файл?


SET serveroutput ON

spool 03_CREATE_CATEGORIEDECL.log

create table CATEGORIEDECLARATION ( 
     nIdCategorieDeclaration  NUMBER(10)   not null,
     ...
constraint PK_CATDECLA primary key (nIdCategorieDeclaration)
/


BEGIN
  select c.nidcalendrier into millesime from calendrier c where c.smillesime = '2010';
  -- Lignes relatives au formulaire CA3
  INSERT into CATEGORIEDECLARATION (nIdCategorieDeclaration,nIdTypeFormulaire,sLibelle,sType,sAide,sTexte,sTexte2,sTypeAffichage,bAffichage,sInterval,nIdCalendrier) 
  values (seq_CATEGORIEDECLARATION.nextval,'5','Autres cas  (zone de saisie libre)', 'SOMME_A_DEDUIRE','','',NULL,'CAT_AUTRE_CAS', 1, 'POSITIF',millesime);

  COMMIT;
END; 
/
spool off

Другой подход заключается в динамическом создании сценария и вызове его

<pre> SET serveroutput ON SET FEEDBACK OFF SET HEADING OFF SET LINESIZE 800 SET PAGESIZE 0 SET ECHO OFF</p> <p>SPOOL gen_cr_table_script.sql SELECT 'create table CATEGORIEDECLARATION ( nIdCategorieDeclaration NUMBER(10) not null, ... constraint PK_CATDECLA primary key (nIdCategorieDeclaration) )' FROM SYS.DUAL / SPOOL OFF</p> <p>@gen_cr_table_script.sql</p> <p>-- you can generate the insert script here if needed -- spool gen_ins_script.sql -- select ... -- spool off -- spool 03_CREATE_CATEGORIEDECL.log -- @gen_ins_script.sql -- spool off -- add commit where appropriate * 1009.*

Или вы можете использовать простой подход sqlplus без блоков pl / sql

<pre> create table CATEGORIEDECLARATION ( nIdCategorieDeclaration NUMBER(10) not null, ... constraint PK_CATDECLA primary key (nIdCategorieDeclaration) /</p> <p>INSERT INTO CATEGORIEDECLARATION (nIdCategorieDeclaration,nIdTypeFormulaire,sLibelle,sType,sAide,sTexte,sTexte2,sTypeAffichage,bAffichage,sInterval,nIdCalendrier) SELECT (seq_CATEGORIEDECLARATION.nextval,'5','Autres cas (zone de saisie libre)', 'SOMME_A_DEDUIRE','','',NULL,'CAT_AUTRE_CAS', 1, 'POSITIF',c.nidcalendrier); FROM calendrier c WHERE c.smillesime = '2010' / COMMIT /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...