【问题标题】:Oracle schedule job error in plsql quotesplsql报价中的Oracle计划作业错误
【发布时间】:2018-11-05 14:59:20
【问题描述】:

我正在尝试运行这项工作:

BEGIN
    DBMS_SCHEDULER.CREATE_JOB (
            job_name => '"TOCBA"."MAANDELIJKS_AFBOEKING"',
            job_type => 'PLSQL_BLOCK',
            job_action => 'DECLARE

V_SALDO_CREDIT NUMBER;
V_SALDO_STUD NUMBER;
V_LIMIET NUMBER;
V_REKENINGNUMMER NUMBER;
V_CRED_ID NUMBER;
V_STU_ID NUMBER;

BEGIN
FOR R IN (SELECT r2.REKENINGNUMMER AS REKNUMMER FROM Rekening r1 INNER JOIN Rekening r2 ON r1.REKENINGNUMMER = R2.REKENINGNUMMER and r1.REKENINGTYPE = 22 and r2.REKENINGTYPE = 41)
LOOP
   SELECT SALDO, BETAALLIMIET, REKENINGNUMMER, REKENINGID INTO V_SALDO_CREDIT, V_LIMIET, V_REKENINGNUMMER, V_CRED_ID FROM REKENING WHERE REKENINGNUMMER = R.REKNUMMER AND REKENINGTYPE = 41;
   SELECT REKENINGID INTO V_STU_ID FROM REKENING WHERE REKENINGNUMMER = R.REKNUMMER AND REKENINGTYPE = 22;
   V_SALDO_STUD := V_LIMIET -V_SALDO_CREDIT;

   UPDATE REKENING SET SALDO = (SELECT BETAALLIMIET FROM REKENING WHERE REKENINGNUMMER = V_REKENINGNUMMER AND REKENINGTYPE = 41) WHERE REKENINGNUMMER = R.REKNUMMER AND REKENINGTYPE = 41;
   UPDATE REKENING SET SALDO = SALDO - V_SALDO_STUD WHERE REKENINGNUMMER = R.REKNUMMER AND REKENINGTYPE = 22;

   INSERT INTO TRANSACTIE(REKENINGID, BEDRAG, DATUM, IBAN_PARTIJ2, OMSCHRIJVING, TYPE) VALUES (V_STU_ID, V_SALDO_STUD,SYSDATE, V_CRED_ID, "Maandelijkse afboeking " || to_char(sysdate, "Month"), "MND");

   INSERT INTO TRANSACTIE(REKENINGID, BEDRAG, DATUM, IBAN_PARTIJ2, OMSCHRIJVING, TYPE) VALUES (V_CRED_ID, V_SALDO_STUD,SYSDATE, V_STU_ID, "Maandelijkse afboeking " || to_char(sysdate, "Month"), "MND");
END LOOP;
END;',
            number_of_arguments => 0,
            start_date => TO_TIMESTAMP_TZ('2018-11-05 14:15:02.000000000 EUROPE/BERLIN','YYYY-MM-DD HH24:MI:SS.FF TZR'),
            repeat_interval => 'FREQ=MINUTELY;BYDAY=MON',
            end_date => NULL,
            enabled => FALSE,
            auto_drop => FALSE,
            comments => 'geen');




    DBMS_SCHEDULER.SET_ATTRIBUTE( 
             name => '"TOCBA"."MAANDELIJKS_AFBOEKING"', 
             attribute => 'store_output', value => TRUE);
    DBMS_SCHEDULER.SET_ATTRIBUTE( 
             name => '"TOCBA"."MAANDELIJKS_AFBOEKING"', 
             attribute => 'logging_level', value => DBMS_SCHEDULER.LOGGING_OFF);




    DBMS_SCHEDULER.enable(
             name => '"TOCBA"."MAANDELIJKS_AFBOEKING"');
END;

PL/SQL 代码已经过测试,并且在没有 Job 的情况下可以正常工作。当我尝试像这样运行它时,出现以下错误:

"ORA-06550: Regel 20, kolom 198:
PL/SQL: ORA-00984: Kolom is hier niet toegestaan..
ORA-06550: Regel 20, kolom 4:
PL/SQL: SQL Statement ignored.
ORA-06550: Regel 22, kolom 198:
PL/SQL: ORA-00984: Kolom is hier niet toegestaan..
ORA-06550: Regel 22, kolom 4:
PL/SQL: SQL Statement ignored.
"

当我删除两个插入 (TRANSACTIES) 语句时工作正常。我想问题是因为引号而发生的。这里有人知道如何解决这个问题吗?

【问题讨论】:

  • 英文错误的意思是:ORA-00984: column not allowed here
  • 你需要使用单引号来表示字符串,而不是双引号。
  • 请把DBMS_SESSION.SET_NLS('NLS_LANGUAGE', 'american');放在块的开头,然后错误信息应该是英文的。或者在创建作业之前运行ALTER SESSION SET NLS_LANGUAGE = 'american';
  • 我建议编写一个包含所有内容的过程,并在作业调度程序中使用单个命令执行此过程。
  • 这是正确的吗,您喜欢每分钟执行一次作业,但只在星期一执行?

标签: sql oracle plsql jobs


【解决方案1】:

我看到了你的问题。问题在于在job_action => 的大单引号内使用单引号。您需要将每个单引号写两次(例如,而不是 ''')。它不是双引号,而是写了两次的单引号。因此,您的插入语句将如下所示:

INSERT INTO TRANSACTIE(REKENINGID, BEDRAG, DATUM, IBAN_PARTIJ2, OMSCHRIJVING, TYPE) 
VALUES (V_STU_ID, V_SALDO_STUD,SYSDATE, V_CRED_ID, ''Maandelijkse afboeking '' || to_char(sysdate, ''Month''), ''MND'');

INSERT INTO TRANSACTIE(REKENINGID, BEDRAG, DATUM, IBAN_PARTIJ2, OMSCHRIJVING, TYPE) 
VALUES (V_CRED_ID, V_SALDO_STUD,SYSDATE, V_STU_ID, ''Maandelijkse afboeking '' || to_char(sysdate, ''Month''), ''MND'');

希望对你有帮助。

【讨论】:

    【解决方案2】:

    是的,因为您注意到单引号中的问题,请按照以下示例进行操作:

    单引号用来封闭 Varchar(字面量)和日期值,双引号用来封闭表格、列……这就是为什么它会弹出错误列,此处不允许使用双引号。

    DECLARE
    
    V_SALDO_CREDIT NUMBER;
    V_SALDO_STUD NUMBER;
    V_LIMIET NUMBER;
    V_REKENINGNUMMER NUMBER;
    V_CRED_ID NUMBER;
    V_STU_ID NUMBER;
    
    BEGIN
    
    
       INSERT INTO TRANSACTIE
         (REKENINGID, BEDRAG, DATUM, IBAN_PARTIJ2, OMSCHRIJVING, TYPE)
       VALUES
         (V_STU_ID,
          V_SALDO_STUD,
          SYSDATE,
          V_CRED_ID,
          'Maandelijkse afboeking ' || to_char(sysdate, 'Month'),
          'MND');
    
    END;
    

    【讨论】:

      【解决方案3】:

      您还可以对字符串文字使用替代引用机制 (''Q'')

      https://livesql.oracle.com/apex/livesql/file/content_CIREYU9EA54EOKQ7LAMZKRF6P.html

      【讨论】:

        猜你喜欢
        • 2010-09-19
        • 2017-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多