2017-01-25 1 views
2

У меня есть это заявление, которое вставляет некоторую информацию плюс полный триггер внутри CLOB. Тем не менее, я получаю эту ошибку: ORA-01756: quoted string not properly terminatedХранить запись PL/SQL в значении CLOB, escape-символы не работают

Я добавил символ escape (') перед каждой цитатой в триггере. Но я не понимаю, почему я продолжаю получать эту ошибку.

Это запрос, создание таблицы:

CREATE TABLE Template (id number(10) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 2), triggerEvent clob NOT NULL, triggerCode clob NOT NULL, TemplateTypeid number(10) NOT NULL, PRIMARY KEY (id));

И это вся вставка запрос:

drop table template CASCADE CONSTRAINTS PURGE; 
drop table TemplateType CASCADE CONSTRAINTS PURGE; 
drop table BusinessRuleType CASCADE CONSTRAINTS PURGE; 
drop table Operator CASCADE CONSTRAINTS PURGE; 
drop table Category CASCADE CONSTRAINTS PURGE; 
drop table BusinessRule CASCADE CONSTRAINTS PURGE; 
drop table TargetDatabase CASCADE CONSTRAINTS PURGE; 
drop table BusinessRuleType_Operator CASCADE CONSTRAINTS PURGE; 
drop table DatabaseType CASCADE CONSTRAINTS PURGE; 
drop table RuleValues CASCADE CONSTRAINTS PURGE; 
drop sequence ARNG_seq; 

CREATE SEQUENCE ARNG_seq; 

CREATE TABLE Template (id number(10) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 2), triggerEvent clob NOT NULL, triggerCode clob NOT NULL, TemplateTypeid number(10) NOT NULL, PRIMARY KEY (id)); 
CREATE TABLE TemplateType (id number(10) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 2), category varchar2(255) NOT NULL, DatabaseTypeid number(10) NOT NULL, PRIMARY KEY (id)); 
CREATE TABLE BusinessRuleType (id number(10) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 2), name varchar2(255), Categoryid number(10) NOT NULL, Templateid number(10) NOT NULL, PRIMARY KEY (id)); 
CREATE TABLE Operator (id number(10) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 5), operatorType varchar2(255) NOT NULL, name varchar2(255) NOT NULL, value varchar2(255) NOT NULL, PRIMARY KEY (id)); 
CREATE TABLE Category (id number(10) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 2), name varchar2(255) NOT NULL, PRIMARY KEY (id)); 
CREATE TABLE BusinessRule (id number(10) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 2), generatedCode clob, name varchar2(255) NOT NULL, errorMessage varchar2(255) NOT NULL, validationFailureSeverity varchar2(50) NOT NULL, targetColumn varchar2(255) NOT NULL, targetTable varchar2(255) NOT NULL, BusinessRuleTypeid number(10) NOT NULL, SavedTargetDatabaseid number(10) NOT NULL, Operatorid number(10) NOT NULL, PRIMARY KEY (id)); 
CREATE TABLE TargetDatabase (id number(10) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 2), name varchar2(255) NOT NULL, url varchar2(255) NOT NULL, username varchar2(255) NOT NULL, password varchar2(255) NOT NULL, DatabaseTypeid number(10) NOT NULL, PRIMARY KEY (id)); 
CREATE TABLE BusinessRuleType_Operator (BusinessRuleTypeid number(10) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 2), Operatorid number(10) NOT NULL, PRIMARY KEY (BusinessRuleTypeid, Operatorid)); 
CREATE TABLE DatabaseType (id number(10) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 2), databaseType varchar2(255) NOT NULL, PRIMARY KEY (id)); 
CREATE TABLE RuleValues (id number(10) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 2), name varchar2(255) NOT NULL, stringValue varchar2(255), intValue number(10), clobValue clob, BusinessRuleid number(10) NOT NULL, PRIMARY KEY (id)); 
ALTER TABLE BusinessRuleType ADD CONSTRAINT FKBusinessRu863439 FOREIGN KEY (Categoryid) REFERENCES Category (id); 
ALTER TABLE BusinessRule ADD CONSTRAINT FKBusinessRu277804 FOREIGN KEY (BusinessRuleTypeid) REFERENCES BusinessRuleType (id); 
ALTER TABLE BusinessRuleType ADD CONSTRAINT FKBusinessRu443116 FOREIGN KEY (Templateid) REFERENCES Template (id); 
ALTER TABLE Template ADD CONSTRAINT FKTemplate586491 FOREIGN KEY (TemplateTypeid) REFERENCES TemplateType (id); 
ALTER TABLE BusinessRuleType_Operator ADD CONSTRAINT FKBusinessRu447733 FOREIGN KEY (BusinessRuleTypeid) REFERENCES BusinessRuleType (id); 
ALTER TABLE BusinessRuleType_Operator ADD CONSTRAINT FKBusinessRu382431 FOREIGN KEY (Operatorid) REFERENCES Operator (id); 
ALTER TABLE BusinessRule ADD CONSTRAINT FKBusinessRu873463 FOREIGN KEY (SavedTargetDatabaseid) REFERENCES TargetDatabase (id); 
ALTER TABLE TemplateType ADD CONSTRAINT FKTemplateTy236989 FOREIGN KEY (DatabaseTypeid) REFERENCES DatabaseType (id); 
ALTER TABLE TargetDatabase ADD CONSTRAINT FKTargetData209438 FOREIGN KEY (DatabaseTypeid) REFERENCES DatabaseType (id); 
ALTER TABLE BusinessRule ADD CONSTRAINT FKBusinessRu447639 FOREIGN KEY (Operatorid) REFERENCES Operator (id); 
ALTER TABLE RuleValues ADD CONSTRAINT FKRuleValues255277 FOREIGN KEY (BusinessRuleid) REFERENCES BusinessRule (id); 


INSERT INTO Category (id, name) VALUES (1, 'Static'); 
INSERT INTO Category (id, name) VALUES (2, 'Dynamic'); 

INSERT INTO Operator (id, operatortype, name, value) VALUES (1, 'Compare', 'Equals', '='); 
INSERT INTO Operator (id, operatortype, name, value) VALUES (2, 'Compare', 'Not Equals', '!='); 
INSERT INTO Operator (id, operatortype, name, value) VALUES (3, 'Range', 'Between', 'BETWEEN'); 
INSERT INTO Operator (id, operatortype, name, value) VALUES (4, 'Range', 'Not Between', 'NOTBETWEEN'); 


INSERT INTO DatabaseType (id, databaseType) VALUES (1, 'Oracle'); 

INSERT INTO TargetDatabase (id, name, url, username, password, DatabaseTypeid) VALUES (1, 'School Database', 'XXXX', 'XXX', 'XX', 1); 

INSERT INTO TemplateType (id, category, DatabaseTypeid) VALUES (1, 'Constraint', 1); 

INSERT INTO Template (id, triggerevent, triggercode, templatetypeid) VALUES (1, 'insert, update <<column>> | <<table>>', q'[CREATE OR REPLACE TRIGGER BRG_{code}_{attribute_table}_TRG 
BEFORE DELETE OR INSERT OR UPDATE 
ON {attribute_table} 
FOR EACH ROW 
DECLARE 
    L_OPER  VARCHAR2(3); 
    L_ERROR_STACK VARCHAR2(4000); 
BEGIN 
    IF INSERTING 
    THEN 
    L_OPER := 'INS'; 
    ELSIF UPDATING 
    THEN 
     L_OPER := 'UPD'; 
    ELSIF DELETING 
    THEN 
     L_OPER := 'DEL'; 
    END IF; 
    DECLARE 
    L_PASSED BOOLEAN := TRUE; 
    BEGIN 
    IF L_OPER IN ('INS', 'UPD') 
    THEN 
     IF '{operand}' = '=' THEN 
     L_PASSED := :NEW.{attribute_column} >= {range_min} AND :NEW.{attribute_column} <= {range_max}; 
     ELSE 
     L_PASSED := :NEW.{attribute_column} < {range_min} OR :NEW.{attribute_column} > {range_max}; 
     END IF; 

     IF NOT L_PASSED 
     THEN 
     raise_application_error(-20000, {error}); 
     END IF; 
    END IF; 
    END; 
END;]' , 1); 


INSERT INTO BusinessRuleType (id, name, categoryid, templateid) VALUES (1, 'Attribute Range Rule', 1, 1); 
INSERT INTO BusinessRule (id, name, errorMessage, validationFailureSeverity, targetColumn, targetTable, BusinessRuleTypeid, SavedTargetDatabaseid, Operatorid) VALUES (1, 'BRG_NMR_CNS_RNG_01', 'Zit niet in de range', 'Informational Warning', 'cijfer', 'rapport', 1, 1, 1); 

INSERT INTO RuleValues (id, name, intValue, BusinessRuleid) VALUES (1, 'MinValue', 1, 1); 
INSERT INTO RuleValues (id, name, intValue, BusinessRuleid) VALUES (2, 'MaxValue', 10, 1); 

INSERT INTO BusinessRuleType_operator (businessruletypeid, operatorid) VALUES (1,1); 

Причина мне нужен весь этот триггер, сохраненный в базе данных, как CLOB , потому что мой бэкэнд Java будет работать на нем.

ответ

0

У меня не было проблем с выполнением этих двух утверждений. Кроме того, вы можете использовать Q-символ, чтобы избежать необходимости избегать ваших котировок. Как и в:

д «[вставить ххх значений (» а «„B“,„C“)]»

Но, как я уже говорил выше, не было никаких проблем с кодом вы в курсе, так насколько я могу судить.

CREATE TABLE template 
(
    id    NUMBER (10) 
     GENERATED BY DEFAULT ON NULL AS IDENTITY (  START WITH 2), 
    triggerevent  CLOB NOT NULL, 
    triggercode  CLOB NOT NULL, 
    templatetypeid NUMBER (10) NOT NULL, 
    PRIMARY KEY (id) 
) 
/

BEGIN 
    INSERT INTO template (id, 
         triggerevent, 
         triggercode, 
         templatetypeid) 
      VALUES (
        1, 
        'insert, update <<column>> | <<table>>', 
        'CREATE OR REPLACE TRIGGER BRG_{code}_{attribute_table}_TRG 
BEFORE DELETE OR INSERT OR UPDATE 
ON {attribute_table} 
FOR EACH ROW 
DECLARE 
    L_OPER  VARCHAR2(3); 
    L_ERROR_STACK VARCHAR2(4000); 
BEGIN 
    IF INSERTING 
    THEN 
    L_OPER := ''INS''; 
    ELSIF UPDATING 
    THEN 
     L_OPER := ''UPD''; 
    ELSIF DELETING 
    THEN 
     L_OPER := ''DEL''; 
    END IF; 
    DECLARE 
    L_PASSED BOOLEAN := TRUE; 
    BEGIN 
    IF L_OPER IN (''INS'', ''UPD'') 
    THEN 
     IF ''{operand}'' = ''BETWEEN'' THEN 
     L_PASSED := :NEW.{attribute_column} >= {range_min} AND :NEW.{attribute_column} <= {range_max}; 
     ELSE 
     L_PASSED := :NEW.{attribute_column} < {range_min} OR :NEW.{attribute_column} > {range_max}; 
     END IF; 

     IF NOT L_PASSED 
     THEN 
     raise_application_error(-20000, {error}); 
     END IF; 
    END IF; 
    END; 
END;', 
        1); 
END; 
+0

спасибо, что нашли время, чтобы запустить его. Тем не менее, он все еще дает мне ошибку (даже с выражением q []). Я редактировал свой первоначальный пост, чтобы показать вам полный сценарий, который я пытаюсь запустить. Я бы очень признателен, если бы вы это поняли. –

+0

Вы запустили мой код? –

+0

Я действительно запустил ваш код. Однако это все равно дало нам ошибку, что-то о ожидании оператора INSERT. Мы работали над проблемой, сделав квоту нулевой, а в конце файла вставляем ее в шаблон (бит гетто-решения, но это был единственный способ понять это). Вы пытались запустить весь файл, который я добавил в главный пост? Заранее спасибо. –

0

Для этого механизма цитирования я предпочитаю использовать q '~ blbelbe ~' - ~ очень редкий символ.

И ваша проблема решена здесь Oracle 12c. Text literals

If the opening quote_delimiter is one of [, {, <, or (, then the closing quote_delimiter must be the corresponding ], }, >, or). In all other cases, the opening and closing quote_delimiter must be the same character.

+0

Правда, но это не ново в 12c. –

Смежные вопросы