pl/sql学习总结常见problem:引号/调试

我在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,

每次点击"单步调试" 就可以看到变量的变化, 当出现问题的时候, 会终止运行并自动识别出来!

猜你喜欢

转载自www.cnblogs.com/xuying-fall/p/9509502.html