Oracle

嘗試執行動態 pl/sql 時遇到錯誤

  • June 10, 2019

希望你做得好我是 PL/SQL 的新手,我正在嘗試編寫動態 PL/SQL。到目前為止我寫的是:

declare

  sql_stmt     varchar2(100);
  v_student_id number := 1;
  v_new_stname varchar2(50);

begin

 sql_stmt := 'update student 
              set student_name = ''pantea'' where student_id :1 ' ||
             'returning student_name into :2';
 execute immediate sql_stmt
 using v_student_id
 returning into v_new_stname;

    dbms_output.put_line('New student name is :' || v_new_stname);

end;

當我想執行程式碼時,我看到了這個錯誤:

ORA-06502:Numeric or value error:Character string buffer too small.

我 80% 確定問題可能出在這部分程式碼中

set student_name = ''pantea''

但我不知道如何解決它,我也無法在 oracle 書籍上找到它,我知道如何在 T/SQL 中處理這個問題,但不知道如何在 PL/SQL 中處理這個問題。

您忘記了 WHERE 子句的比較運算符

如果您真的想使用動態 SQL(這樣的簡單 UPDATE 語句不需要),那麼您還應該將所有值作為參數傳遞,而不僅僅是學生 ID。

declare
  sql_stmt     varchar2(100);
  v_student_id number := 1;
  v_name varchar2(20) := 'pantea';
  v_new_stname varchar2(50);
begin
 sql_stmt := 'update student set student_name = :1 '|| 
             'where student_id = :2 '|| 
             'returning student_name into :3';

 execute immediate sql_stmt
   using v_name, v_student_id
   returning into v_new_stname;

 dbms_output.put_line('New student name is: ' || v_new_stname);
end; 
/ 

當您在多行上繼續字元串文字(常量)時,似乎會發生“字元串緩衝區太小”。因此,最好打開和關閉每行上的字元串常量並將它們連接起來,||而不是像您那樣在字元串中嵌入新行。

引用自:https://dba.stackexchange.com/questions/240173