今天又看了一下动态SQL 网上人写的文章是不是有问题啊误导我啊 有图有真想 求指点

[复制链接]
查看11 | 回复9 | 2015-7-24 10:50:33 | 显示全部楼层 |阅读模式
本帖最后由 苏上人 于 2013-10-27 11:36 编辑
我看有的人这样写的execute immediate 'sql '
using p_id
returning into v_name,v_salary; --动态SQL


1.jpg (31.24 KB, 下载次数: 18)
下载附件
2013-10-27 11:19 上传

如图 博客链接地址是http://www.cnblogs.com/gaolonglong/archive/2011/05/31/2064790.html
而有的人是这样写的 execute immediate 'sql'
into l_nam, l_loc
using l_dept ;



2.jpg (17.36 KB, 下载次数: 14)
下载附件
2013-10-27 11:21 上传

链接地址 http://www.evget.com/zh-CN/Info/catalog/11340.html
那我现在疑惑的就是到底标准形式是这样写execute immediate 'sql'
into 变量1,变量2
using 变量0 ;

还是这样写 execute immediate 'sql '
using变量0
returning into 变量1,变量2;
好像这两种写法的区别就是有一个有returning 一个没哟还有就是using 的顺序不一样 一个靠着execute immediate 'sql ' 到底哪种方法正确求指点

回复

使用道具 举报

千问 | 2015-7-24 10:50:33 | 显示全部楼层
上次大家就告诉你了returning into 不能用于select 的动态语句。上面那个是错的。
回复

使用道具 举报

千问 | 2015-7-24 10:50:33 | 显示全部楼层
本帖最后由 苏上人 于 2013-10-27 13:59 编辑
苏大师的回答各位小伙伴门 一起来讨论啊可是苏大师的我没明啊 不是 EXECUTE IMMEDIATE 后面跟SQL怎么苏大师把 RETURNING n INTO :n' 这些东西放到SQL语句里面啊 我看网上这些例子啥的 都是把into或者 RETURNING 都在SQL 外面啊我是不是很笨啊这个搞不明白啊
create table t (id number, n number);
insert into t values (1,1);
insert into t values (2,2);
----- RETURNING INTO 可以
DECLARE
lv_n NUMBER;
BEGIN
EXECUTE IMMEDIATE 'UPDATE t SET n=100 WHERE id=2 RETURNING n INTO :n' RETURNING INTO lv_n;
DBMS_OUTPUT.PUT_LINE(lv_n);
END;
/
----- USING OUT也可以
DECLARE
lv_n NUMBER;
BEGIN
EXECUTE IMMEDIATE 'UPDATE t SET n=100 WHERE id=2 RETURNING n INTO :n' USING OUT lv_n;
DBMS_OUTPUT.PUT_LINE(lv_n);
END;
/

----- INTO不可以
DECLARE
lv_n NUMBER;
BEGIN
EXECUTE IMMEDIATE 'UPDATE t SET n=100 WHERE id=2 RETURNING n INTO :n' INTO lv_n;
DBMS_OUTPUT.PUT_LINE(lv_n);
END;
/

-------如果是SELECT而非DML(INSERT/DELETE/UPATE), 可以用INTO
DECLARE
lv_n NUMBER;
BEGIN
EXECUTE IMMEDIATE 'SELECT n FROM t WHERE id=2 ' INTO lv_n;
DBMS_OUTPUT.PUT_LINE(lv_n);
END;


回复

使用道具 举报

千问 | 2015-7-24 10:50:33 | 显示全部楼层
本帖最后由 苏上人 于 2013-10-27 19:23 编辑
苏上人 发表于 2013-10-27 12:37
苏大师的回答各位小伙伴门 一起来讨论啊可是苏大师的我没明啊 不是 EXECUTE IMMEDIATE 后面跟SQL怎 ...

苏大师你上次举的例子我不是很明白啊 你举的例子EXECUTE IMMEDIATE 'SQL'你这SQL里怎么有RETURNING 和INTO这些东西啊 我看网上人家写的例子都是在SQL语句外 就像我帖子图片举的例子哪个正确啊 感觉网上有好多人写的文章误导人啊请大师指点一下迷津 比如你举的那个例子
DECLARE
lv_n NUMBER;
BEGIN
EXECUTE IMMEDIATE 'UPDATE t SET n=100 WHERE id=2 RETURNING n INTO :n' RETURNING INTO lv_n;
DBMS_OUTPUT.PUT_LINE(lv_n);
END;
/
那个红色的部分我不是很理解啊 里面两个 RETURNING有啥作用 啊 还有后面那个INTO :n 是干啥的啊 大家都来指点我啊
create or replace procedure find_info(p_id number) as
v_name varchar2(10);
v_salary number;
begin
execute immediate '
select name,salary from emp
where id=:1'
using p_id
returning into v_name,v_salary; --动态SQL为查询语句
dbms_output.put_line(v_name ||'的收入为:'||to_char(v_salary));
exception
when others then
dbms_output.put_line('找不到相应数据');
end find_info;
难道这个存储过程是错误的 就是紫色的那是错的吗我百度 ORACLE 动态SQL 都用这例子举例子呢唉论坛这么多高手 没人写个动态SQL的入门文章吗


回复

使用道具 举报

千问 | 2015-7-24 10:50:33 | 显示全部楼层
试一试不就知道了~ 而且你已经知道
execute immediate 'sql'
into 变量1,变量2
using 变量0 ;

还在这里问,试一下就好~多动手呀

回复

使用道具 举报

千问 | 2015-7-24 10:50:33 | 显示全部楼层
那例子是错的,DML才可以,而且insert into select也不可以
其他,语法规定的,可以看PL/SQL REFERENCE官方文档
回复

使用道具 举报

千问 | 2015-7-24 10:50:33 | 显示全部楼层
这东西还要写文档???官方文档上很详细啊
回复

使用道具 举报

千问 | 2015-7-24 10:50:33 | 显示全部楼层
苏上人 发表于 2013-10-28 09:58
你就写个吗 有好多人和我一样是初学者啊你写的东西简单易懂啊你就写个啊 造福广大的初学者啊

http://docs.oracle.com/cd/B19306 ... ninginto_clause.htm
文档上清清楚楚啊
回复

使用道具 举报

千问 | 2015-7-24 10:50:33 | 显示全部楼层
苏上人 发表于 2013-10-28 18:10
都英文啊我英文还六级呢 都懒得看 你让其它小伙伴没过四级的咋看啊你就写个中文入门指导呀给给像我 ...

"懒得看"那我还懒得教呢。
哪里看不懂还好说,看得懂却不看就是你的不对了。
回复

使用道具 举报

千问 | 2015-7-24 10:50:33 | 显示全部楼层
苏上人 发表于 2013-10-28 18:10
都英文啊我英文还六级呢 都懒得看 你让其它小伙伴没过四级的咋看啊你就写个中文入门指导呀给给像我 ...

如果你 拒绝 官方文档,你永远只能是入门!
而且你还过了六级,比我好太多了.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行