写存储过程时,引号是一个永远避不开的祸,如果只是单个引号的话很好用,比如向表中插入数据,

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插入,用变量承载数据的话,这时候字符型用三个单引号引起表示一个单引号,而数值型和时间函数的转换格式需要用一个单引号引起来,前者表明它是数值,后者两个单引号表示一个单引号。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐