這是我的 plsql 塊,動態 SQL。我找不到它出現錯誤“no ORA-01008: not all variables bound ORA-06512: at line 23”的原因。
我在 EXECUTE IMMEDIATE 陳述句中找不到錯誤。
DECLARE
form_name VARCHAR2(225) := 'MUST AS';
ad_no VARCHAR2(225) := :ad_no;
sql_stmt VARCHAR2(4000);
sql_output VARCHAR2(4000);
db_table VARCHAR(225) := inp_reminder_pkg.form_db_table(form_name);
col_id VARCHAR(225) := inp_reminder_pkg.get_col_id(form_name);
BEGIN
sql_stmt := '
SELECT :1
FROM @tableName
WHERE advno = :2
AND created = ( SELECT MAX(CREATED)
FROM @tableName
WHERE advno = :2 )'
;
sql_stmt := replace(sql_stmt, '@tableName', db_table);
EXECUTE IMMEDIATE sql_stmt
INTO sql_output
USING col_id, ad_no;
dbms_output.put_line(sql_output);
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('no-data');
END;
讓我知道我缺少什么。感謝您
uj5u.com熱心網友回復:
有三個系結變數(即使兩個具有相同的名稱),您需要在execute immediate陳述句中為它們發送 3 個引數。
請注意,您可能并不是想將列名作為系結變數輸入,如果您想選擇一個變數列,則必須動態執行此操作。
uj5u.com熱心網友回復:
您的代碼有兩個問題:
- 動態查詢有兩個占位符實體,
:advno因此您需要在 USING 子句中傳遞兩個值。是的,這有點廢話,但我猜 Oracle 認為在不要求編譯器匹配占位符名稱的情況下決議動態 SQL 已經夠難了。 - 我們不能將列名或其他識別符號作為引數傳遞。我們必須分解陳述句以參考列名變數。出于同樣的原因,您可以
replace()呼叫替換表名。
所以你需要改變你的程式,使它看起來像這樣:
DECLARE
form_name VARCHAR2(225) := 'MUST AS';
ad_no VARCHAR2(225) := :ad_no;
sql_stmt VARCHAR2(4000);
sql_output VARCHAR2(4000);
db_table VARCHAR(225) := inp_reminder_pkg.form_db_table(form_name);
col_id VARCHAR(225) := inp_reminder_pkg.get_col_id(form_name);
BEGIN
sql_stmt := '
SELECT ' || col_id || '
FROM @tableName
WHERE advno = :2
AND created = ( SELECT MAX(CREATED)
FROM @tableName
WHERE advno = :2 )'
;
sql_stmt := replace(sql_stmt, '@tableName', db_table);
EXECUTE IMMEDIATE sql_stmt
INTO sql_output
USING ad_no, ad_no;
dbms_output.put_line(sql_output);
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('no-data');
END;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/340650.html
