php动态mysql语句吗_如何使用动态SQL语句?

每个对应子程序参数占位符的绑定参数与子程序参数具有相同的参数模式和兼容的数据类型。

绑定参数不要有SQL不支持的数据类型(例如,布尔类型,关联数组,以及用户自定的记录类型)

USING子句不能包含NULL字面量。如果想要在USING子句中使用NULL值,可以使用位初始化的变量或者函数显示将NULL转换成一个有类型的值。

2.1动态SQL语句是一个最多只能返回一行的SELECT语句

使用动态SQL语句返回单列,查询SCOTT的薪水:

declare

v_sql_text varchar2(1000);

v_sal number;

v_ename emp.ename%type := 'SCOTT';

begin

v_sql_text := 'select e.sal from emp e where e.ename = :ename';

execute immediate v_sql_text

into v_sal

using v_ename;

dbms_output.put_line(v_ename || ':' || v_sal);

end;

使用动态SQL返回一条记录,查询SCOTT的基本信息:

declare

v_sql_text varchar2(1000);

v_ename emp.ename%type := 'SCOTT';

vrt_emp emp%rowtype;

begin

v_sql_text := 'select * from emp e where e.ename = :ename';

execute immediate v_sql_text

into vrt_emp

using v_ename;

dbms_output.put_line(v_ename || '的基本信息:');

dbms_output.put_line('工号:' || vrt_emp.empno);

dbms_output.put_line('工资:' || vrt_emp.sal);

dbms_output.put_line('入职日期:' || vrt_emp.hiredate);

end;

2.2动态SQL语句是一个可以返回多行的SELECT语句

2.2.1只有一个占位符

使用动态SQL语句返回多行记录,查询30部门的员工基本信息:

declare

v_sql_text varchar2(1000);

v_deptno emp.deptno%type := 30;

type nt_emp is table of emp%rowtype;

vnt_emp nt_emp;

begin

v_sql_text := 'select * from emp e where e.deptno = :deptno';

execute immediate v_sql_text bulk collect

into vnt_emp

using v_deptno;

for i in 1 .. vnt_emp.count loop

dbms_output.put_line(vnt_emp(i).ename || '的基本信息:');

dbms_output.put_line('工号:' || vnt_emp(i).empno);

dbms_output.put_line('工资:' || vnt_emp(i).sal);

dbms_output.put_line('入职日期:' || vnt_emp(i).hiredate);

dbms_output.put_line('');

end loop;

end

2.2.2多个占位符

查询20部门工资大于2000的员工基本信息:

declare

v_sql_text varchar2(1000);

v_deptno emp.deptno%type := 20;

v_sal number := 2000;

type nt_emp is table of emp%rowtype;

vnt_emp nt_emp;

begin

v_sql_text := 'select * from emp e where e.sal>:sal and e.deptno = :deptno';

execute immediate v_sql_text bulk collect

into vnt_emp

using v_sal, v_deptno; --注意绑定多个变量时,绑定变量只与占位符位置有关,与占位符名称无关,

for i in 1 .. vnt_emp.count loop

dbms_output.put_line(vnt_emp(i).ename || '的基本信息:');

dbms_output.put_line('工号:' || vnt_emp(i).empno);

dbms_output.put_line('工资:' || vnt_emp(i).sal);

dbms_output.put_line('入职日期:' || vnt_emp(i).hiredate);

dbms_output.put_line('');

end loop;

注意:对于SQL文本,占位符名称是没有意义的,绑定变量与占位符名称无关,只与占位符的配置有关。即使有多个相同名称占位符,也需要每个占位符对应一个绑定变量。对于PL/SQL块,占位符名称是有意义的,相同名称的占位符,只需要第一个占位符绑定变量。

2.3动态SQL语句是一个带有RETURNING子句的DML语句

KING的工资增长20%,返回增长后的工资:

eclare

v_sql_text varchar2(1000);

v_sal number;

v_ename emp.ename%type := 'KING';

begin

v_sql_text := 'update emp e set e.sal= e.sal*1.2 where e.ename = :ename returning e.sal into :sal';

execute immediate v_sql_text

using v_ename

returning into v_sal;

dbms_output.put_line(v_ename || ':' || v_sal);

end;

注意:只有当v_sql_text语句有returning into子句时,动态SQL语句才能使用returning into子句。

2.4给占位符传递NULL值

2.4.1通过未初始化变量传递NULL值

declare

v_sql_text varchar2(1000);

v_deptno emp.ename%type := 'ALLEN';

v_comm emp.comm%type;

begin

v_sql_text := 'update emp e set e.comm = :comm where e.ename =:ename';

execute immediate v_sql_text

using v_comm, v_deptno;

end;

2.4.2通过函数将NULL值显式的转换成一个有类型的值

declare

v_sql_text varchar2(1000);

v_deptno emp.ename%type := 'ALLEN';

begin

v_sql_text := 'update emp e set e.comm = :comm where e.ename =:ename';

execute immediate v_sql_text

using to_number(null), v_deptno;

end;

3.OPEN FOR语句

PL/SQL引入OPEN FOR语句实际上并不是为了支持本地动态SQL,而是为了支持游标变量。现在它以一种极其优雅的方式实现了多行的动态查询。

使用OPEN FOR语句来关联动态SQL语句的游标变量,在OPEN FOR语句的USING子句中,指定动态SQL语句每个占位符的绑定参数。

使用FETCH语句获取运行时结果集。使用CLOSE语句关闭游标变量

使用OPEN FOR语句查询出10部门的员工的基本信息:

declare

type rc_emp is ref cursor;

vrc_emp rc_emp;

v_sql_text varchar2(1000);

v_deptno emp.deptno%type := 10;

vrt_emp emp%rowtype;

begin

v_sql_text := 'select * from emp e where e.deptno=:deptno';

open vrc_emp for v_sql_text

using v_deptno;

loop

exit when vrc_emp%notfound;

fetch vrc_emp

into vrt_emp;

dbms_output.put_line(vrt_emp.ename || '的基本信息:');

dbms_output.put_line('工号:' || vrt_emp.empno);

dbms_output.put_line('工资:' || vrt_emp.sal);

dbms_output.put_line('入职日期:' || vrt_emp.hiredate);

dbms_output.put_line('');

end loop;

close vrc_emp;

end;

4.重复的占位符名称

如果在动态SQL语句重复占位符名称,要知道占位符关联绑定参数的方式依赖于动态语句的类型。

如果执行的是一个动态SQL字符串,则必须为每一个占位符提供一个绑定参数,即使这些占位符是重复的。如果执行的是一个动态PL/SQL块,则必须为每一个唯一占位符提供一个绑定参数,即重复的占位符只需要提供一个绑定参数。

4.1重复占位符的动态SQL字符串

declare

v_sql_text varchar2(1000);

v_sal emp.sal%type := 4000;

v_comm emp.comm%type;

v_ename emp.ename%type := 'SCOTT';

begin

v_sql_text := 'update emp e set e.sal=:sal , e.comm = :sal*0.1 where e.ename =:ename returning e.comm into :comm ';

execute immediate v_sql_text

using v_sal, v_sal, in v_ename

returning into v_comm;

dbms_output.put_line(v_ename || '分红:' || v_comm);

end;

4.2重复占位符的动态PL/SQL块

declare

v_sql_text varchar2(1000);

v_sal number;

v_ename emp.ename%type := 'KING';

begin

v_sql_text := ' begin select e.sal,e.ename into :sal,:ename from emp e where e.ename =:ename; end;';

execute immediate v_sql_text

using out v_sal, in out v_ename;

dbms_output.put_line(v_ename || ':' || v_sal);

end;

f68f2add0b68e4f9810432fce46917b7.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值