写存储过程时,引号是一个永远避不开的祸,如果只是单个引号的话很好用,比如向表中插入数据,
1.直接插(字符型加上引号就行)
INSERT INTO DEPT (DEPTNO,DNAME,LOC) VALUES (10,'ACCOUNTING','NEW YORK');
比如这个向DEPT表中插入数据,数据中是字符的加上引号就行。
2.写一个动态SQL插入数据,插入数据时直接执行动态SQL就行
V_SQL:='INSERT INTO DEPT (DEPTNO,DNAME,LOC) VALUES (10,''ACCOUNTING'',''NEW YORK'')';
EXECUTE IMMEDIATE V_SQL; --执行动态SQL
用一个动态SQL插入数据时,因为动态SQL需要单引号括起来,所以如果括号内的字符型数据还用一个单引号的话会报错,因为这时两个单引号表示一个单引号。
3.写一个动态SQL插入数据,插入的数据用一个变量来承载
V_SQL:='INSERT INTO ETL_LOG1 VALUES('''||V_DATA||''','''||V_SP_NAME||''','||V_STEP_NO||','''||V_STEP_DESC||''','''||V_SQL||''','''||O_STEP_RESULT||''',TO_CHAR(SYSDATE,''YYYY-MM-DD HH24:MI:SS''))';
EXECUTE IMMEDIATE V_SQL; --执行动态SQL
--其中变量的类型
V_DATA VARCHAR2(30):='1902' ;--输入日期
V_SQL VARCHAR2(2000) ;--用于运行/记录SQL语句
V_SP_NAME VARCHAR2(50):='SP_DEPT_ANALYSE' ;--表的名称
V_STEP_NO NUMBER :=0 ;--步骤编号
V_STEP_DESC VARCHAR2(200):='建表' ;--步骤描述
O_STEP_RESULT VARCHAR2(1):='1' ;--执行结果
我们可以发现,这插入的变量中,除了V_STEP_NO是数值型和TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS')是使用SYSDATE函数外,其余的都是字符型变量。这时候的引号就不好用了,因为它不仅是动态SQL,插入的数据还是用变量来承载的。
这时候字符型变量需要三个单引号括起来表示一个单引号;而数值型的话,它在动态SQL里如果直接用的话是不需要引号的,但要是用一个变量来承载数值的话,需要一个单引号括起来这个变量,表示这个变量里的数据是数值型的;而函数SYSDATE里的转换格式也需要两个单引号引起表示一个单引号。
总结:直接插入的话,字符型数据需要一个单引号引起表示它是字符串,数值型和日期函数不做处理;使用动态SQL插入的话,字符型使用两个单引号引起表示一个单引号,数字别的不做处理;而使用动态SQL插入,用变量承载数据的话,这时候字符型用三个单引号引起表示一个单引号,而数值型和时间函数的转换格式需要用一个单引号引起来,前者表明它是数值,后者两个单引号表示一个单引号。