很多人没注意的select into 问题讨论

zhuguson 2015-02-11 08:03:36

CREATE OR REPLACE PROCEDURE insertBlob(id varchar2, imgFile varchar2)
IS
img_file BFILE;
img_blob BLOB;
lob_length NUMBER;
BEGIN
INSERT INTO personphoto VALUES(id,empty_blob());
SELECT photo INTO img_blob FROM personphoto WHERE pid = id; -- 这里只是把photo 列值给了img_blob
img_file := bfilename('PHOTO',imgFile);
dbms_lob.OPEN(img_file);
lob_length := dbms_lob.getlength(img_file);
dbms_lob.loadfromfile(img_blob,img_file,lob_length); -- 这里只是把img_blob修改了,但是为什么会同时修改表personphoto 中photo 列对应的记录呢???????
dbms_lob.close(img_file);
COMMIT;
end;
/

比较

CREATE OR REPLACE PROCEDURE testinsert(in_SNO NUMBER)
IS
u_name Varchar2(10);
BEGIN
SELECT sname INTO u_name FROM STUDENT WHERE sno = in_SNO; -- 这里把sname列值给了u_name
u_name := 'TTTT'; -- 这里把u_name改变了,但是STUDENT 表中sname列对应的记录不会变。。。???????
COMMIT;
END;
/


上面两个程序中都是用select into,但是第一个会把表的记录数据也修改,第二个却不会,这是为什么???????
...全文
297 3 打赏 收藏 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
bw555 2015-02-12
  • 打赏
  • 举报
回复
lob类型是个特例,分三个部分:Lob列、lob数据段、lob索引段进行存储 其他类型应该不存在类似问题
zhuguson 2015-02-12
  • 打赏
  • 举报
回复
引用 1 楼 bw555 的回复:
lob类型确实不太一样,lob类型select into获取的是lob类型的存储地址
这个解释似乎有点通,这样的话会不会有其它数据类型也是这样呢?????
bw555 2015-02-11
  • 打赏
  • 举报
回复
lob类型确实不太一样,lob类型select into获取的是lob类型的存储地址

3,499

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧