Ссылки на БД как параметры в функции - PullRequest
0 голосов
/ 04 апреля 2019

Я создаю функцию, которая принимает два параметра.И один из моих параметров будет служить ссылкой на базу данных для моего заявления.Я попытался объединить это.Как я смогу добиться этого?

Это показывает эту ошибку

ORA-00923: ключевое слово FROM не найдено там, где ожидается ORA-06512 в "NOINK.CHECK_SECOND_REF_DIE", строка 13.

Ниже приведен код.

drop function check_second_ref_die;

create or replace function check_second_ref_die(lotNumber in VARCHAR2, db_link in VARCHAR2)
    return varchar2
is

    row_count NUMBER; 
    sql_statement VARCHAR2(300);


BEGIN 
    sql_statement := 'SELECT COUNT(*) FROM wcrepo.WCR_WAFER_REFERENCE@lepftds.itg.ti.com 
    WHERE waferconfigfile = (SELECT waferconfigfile FROM program_setup_rev@' || db_link ||
    'WHERE device = (SELECT device FROM noink.lot WHERE lot_num = ' ||lotNumber || ') 
    AND setup_cnt=0) AND status =' || 'Approved' || 'AND ref_die_type =' || 'Secondary';

    execute immediate sql_statement into row_count;

    IF (row_count != 0) THEN
        RETURN 'TRUE';
    ELSE
        RETURN'FALSE';
    END IF;

  END;

Это код, когда я пытаюсь вызвать функцию

SELECT CASE
           WHEN check_second_ref_die ('8019572', 'rfabtwdb.dal.make.ti.com') = 'TRUE'
           THEN 'EXISTS' ELSE 'NOT EXISTS'
       END
           AS RESULT
  FROM DUAL

1 Ответ

1 голос
/ 04 апреля 2019

AND status =' || 'Approved' || 'AND

Это неправильно. Удалите операторы конкатенации, и мы получим ...

AND status =ApprovedAND 

... который не является допустимым SQL. Для ссылки на строковые литералы вам нужно экранировать одинарные кавычки. Самый простой способ - использовать два из них:

AND status =''Approved'' AND

Вам нужно исправить все строковые литералы в вашем коде.

Динамический SQL сложен, потому что он превращает ошибки компиляции в ошибки времени выполнения. Вы можете упростить отладку своего кода, включив несколько простых инструментов. Если бы в вашем коде была эта строка до EXECUTE IMMEDIATE, вы могли бы увидеть выполненный оператор и, вероятно, заметили шаровую муфту для себя.

dbms_output.put_line(v_sql);
...