我在plsql development学习中遇到的常见问题:
(一) 引号
Oracle 中的单引号与双引号有着完全不同的意义. 单引号用于界定字符串, 双引号用于表示对象名称,,,三个单引号啥情况?
insert into student (123, '''张三'); select * from student; --得到 123 '张三
解释: 连续三个单引号,第一个是字符串界定符,第二个是转义符, 第三个是被转义的字符.
update student set name ='''张三''' where sno=123; select * from student ; --得到 123 '张三'
解释: 三个连续的单引号, 前两个用于转义并获得原义单引号, 第三个是字符串界定符的结尾符.
insert into student (123, ''张三');-- 报错, 引号没有正常结束!
总结: Oracle 遇到字符串的第一个单引号时, 解析为字符串界定符的开始符, 遇到第二个,解释为界定字符串的结束符,但是有第三个单引号存在时, 第二第三个引号解释为原义单引号,
依次类推, Oracle 会寻找下一个单引号作为字符串界定结束符.
''张三' 为啥报错? : 第一个是字符串界定开山符, 第二个解释为字符串界定结束符, 但是后面又是 张三, 整个被认为是非法字符串.
(2)要想在in中用变量,需要用动态SQL,请看下例子,我在oracle 10g中测试通过:
declare
v_1 varchar2(100);
v_2 varchar2(200);
begin
v_1:='(''1'',''2'',''3'')';
v_2:='insert into testa2 select * from testa1 where fch in'|| v_1;
execute immediate v_2;
commit;
end;
v_sql:='SELECT count(*) FROM GCM_SHOHIN WHERE MISE_CD IN('||i_miseCode||')';
exec v_sql into _totalcount;
(二)如何实现一个procedure 的调试
假设已经有了一张表: emp
step1: 创建一个procedure 名字为proc_xy
create or replace procedure proc_xy(v_deptno in varchar2) is begin declare type emp_cursor is ref cursor; emp_cur emp_cursor; v_empno varchar2(10); v_ename varchar2(10); begin open emp_cur for select ename, empno from emp where deptno=v_deptno;--打开与select一起 loop fetch emp_cur into v_empno,v_ename; dbms_output.put_line(v_empno||'_'||v_ename); exit when emp_cur%notfound; end loop; close emp_cur; end; end;
step2: 在左侧的菜单栏中找到 proc_xy
右键proc_xy 先选择添加调试信息!! 这很重要, 否则不能单步调试了.
step3: 右键 选择->测试, 进入测试界面,
然后在下方输入这个procedure 的输入参数,
第一个为开始调试, 第三个是单步调试,下方可以输入想要查看的变量名称.我这里输入的是v_ename,
每次点击"单步调试" 就可以看到变量的变化, 当出现问题的时候, 会终止运行并自动识别出来!