如何在过程中使用变量执行动态sql

问题描述 投票:0回答:1

如何在存储过程中执行动态 SQL,该存储过程使用定义为每月第一天的变量。 考虑这只是一个例子

Declare

V_frst_day date date :=to_date('01-feb-||extract(year from sysdate));
V_sql_string varchar2(1000);

Begin

V_sql_string :=q'[select '||v_frst_day ||' from dual]';

Pkg.other_procedure(
P_sql_qry => v_sql_string);

End;
/
oracle-database stored-procedures plsql oracle19c
1个回答
0
投票

具体方法如下。

我首先设置环境(日期格式和语言,因为我的数据库说克罗地亚语,而不是英语)。

SQL> alter session set nls_date_format = 'dd.mm.yyyy';

Session altered.

SQL> alter session set nls_date_language = 'english';

Session altered.

SQL> set serveroutput on

因为我没有你的包裹,所以我只是

  • 显示要执行的字符串,方便验证是否正确;这就是你每次都应该做的 - 不要只是执行然后想知道出了什么问题
  • 显示结果

由于

v_sql_string
现在是正确的(它执行了,对吧?),将其传递给过程。

SQL> declare
  2     v_frst_day    date := to_date ('01-feb-' || extract (year from sysdate), 'dd-mon-yyyy');
  3     v_sql_string  varchar2 (1000);
  4     v_result      date;
  5  begin
  6     v_sql_string := 'select ' || chr (39) || v_frst_day || chr (39) || ' from dual';
  7
  8     dbms_output.put_line (v_sql_string);
  9
 10     execute immediate v_sql_string
 11        into v_result;
 12
 13     dbms_output.put_line ('Result = ' || v_result);
 14
 15     -- pkg.other_procedure (p_sql_qry => v_sql_string);
 16  end;
 17  /
select '01.02.2024' from dual
Result = 01.02.2024

PL/SQL procedure successfully completed.

SQL>
© www.soinside.com 2019 - 2024. All rights reserved.