存储过程中参数是动态的,需要判断是不是为空

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了存储过程中参数是动态的,需要判断是不是为空相关的知识,希望对你有一定的参考价值。

例子:select a,b.c from xx ,如果前端传递过来的参数只有a字段的值,那么sql变为:select a,b,c from xx group by a 。B和C赋值为0;如果前端传递过来的参数只有a,b字段有值,那么sql变为:select a,b,c from xx group by a,b 。C赋值为0;以此类推。(公司、成本中心等等就是前端会传过来的参数。)
group by a,b 。 b在为什么值得时候group by a,b 跟 group by a 相等。

1、新建一个html文件,命名为test.html。

2、在test.html文件内,使用function声明一个函数,str为函数的参数。

3、在is_e()函数内,首先使用if语句进行null、空、undefined的情况判断,如果符合,则弹出“内容为空”的提示。

4、在is_e()函数内,再使用正则表达式,将空白字符、空格、制表符、换页符等替换为空。

5、再使用if语句判断上一步处理后的数据是否为空,如果为空,则弹出“内容为空”的提示。

6、在is_e函数外,定义一个变量str,用于保存要判断的数据,例如,这里设置str变量为一个空字符,使用is_e()函数进行判断。

参考技术A

直接上代码: 你自己把grop by 加上去,我就不全部写完了。

测试:

结果:

换条件再测试:

结果:


代码:

create or replace procedure test_a(a varchar2,b varchar2,c varchar2) is

         q varchar2(100);

         w varchar2(100);

         e varchar2(100);

         d varchar2(100);

       begin

         if a is null then q:=0;

            else q:=a;

         end if;

         if b is null then w:=0;

            else w:=b;

         end if;

         if c is null then e:=0;

            else e:=c;

         end if;

         d:='select '||q||','||w||','||e||' from xx';

          dbms_output.put_line(d);

       end

;

本回答被提问者采纳
参考技术B create procedure [dbo].P_Test
(
@test varchar(10) = null
)
as
begin
if (@test = 'full') or (@test is null)
begin
sql 语句
end
else if (@test = 'row')
begin
sql 语句
end
end

GO

动态存储过程调用oracle中的动态参数绑定

【中文标题】动态存储过程调用oracle中的动态参数绑定【英文标题】:Dynamic argument binding in dynamic stored procedure call oracle 【发布时间】:2020-03-04 18:54:43 【问题描述】:

我不仅需要动态调用存储过程,还需要动态地将参数传递给该存储过程。

参数来自ALL_ARGUMENTS 表,它是 Oracle 数据字典表。这些论点将根据rpt_wrapper_name 而有所不同。

例如 sp1 如下所示:

sp1 (v1, v2, v3)  

存储过程sp2 如下所示:

sp2 (v1, v2, v3, v4, v5) 

存储过程sp3 将如下所示:

sp3 (v1, v2, v3, v4, v5, v6, v7,...) 

目前我正在尝试动态 SQL 调用,但这对我不起作用

EXECUTE IMEDIATE 'BEGIN ' || p_Rpt_wrapper_name|| '(' || p_ParamList || ') ; END;'
Using  p_ParamListUsing;

where  
p_ParamList := :v1,:v2,:v3
p_ParamListUsing:= v1,v2,v3

错误:

并非所有变量都绑定 ORA-01008

参数列表将根据rpt_wrapper_name而有所不同

我们怎样才能做到这一点?请帮忙

【问题讨论】:

试试这样的:立即执行'begin'|| p_Rpt_wrapper_name||'('||v1||','||v2||....||');结束;'。 @gsalem:你的意思是不要使用 using 子句?静态参数传递对我有用,但我想要动态参数传递.. 我看不出像您所定位的动态传递将如何工作。 【参考方案1】:

方法一:

更改过程以便它们采用参数表。

type r_para is record(
    parameter_name   varchar2(32),
    parameter_vc     varchar2(32000),
    parameter_nb     number,
    parameter_dt     date);
type t_para is table of r_para;

procedure p1(p_parameters t_para);

然后调用

v_para_list.append( r_para ('ref_time',null,null,sysdate);
execute immediate 'proc2(:pin_para)' using v_para_list;

方法二:

使用动态sqlhttps://docs.oracle.com/en/database/oracle/oracle-database/12.2/lnpls/dynamic-sql.html#GUID-1D6A4302-CBA0-47A6-B4A7-80B089DF4E61

c := DBMS_SQL.OPEN_CURSOR(true);
DBMS_SQL.PARSE(c, 'BEGIN get_employee_info(:id); END;', DBMS_SQL.NATIVE);
DBMS_SQL.BIND_VARIABLE(c, ':id', 176);
n := DBMS_SQL.EXECUTE(c);

【讨论】:

@Thomas : 方法 1 没看懂,能否详细说明一下? 我在哪里可以帮助您?如何创建 pl/sql 表?如何填表? @Thomas:任何示例工作代码都将帮助我理解执行流程、调用和解析

以上是关于存储过程中参数是动态的,需要判断是不是为空的主要内容,如果未能解决你的问题,请参考以下文章

oracle 存储过程中 如果用if语句判断一条查询语句的结果集是不是为空

存储过程中为空时处理动态参数

存储过程禁止空参数

Sql server2012存储过程参数传递null值,如何判定这个参数是null

asp.net 使用存储过程时参数为空时的处理

sql操作带参数的时候用下面的方法,但是如果某个参数为 空值的话会报错,应该怎么改?