达梦数据库使用||连接符的动态SQL

1、变量转换后不带’ ’

1.1、创建存储过程,存储过程中包含一个游标,游标为查询某个模式下的表。还包含一个for循环的print,加print是为了更加直观动态语句代入参数后的效果。

CREATE OR REPLACE PROCEDURE T_1208(COL VARCHAR(100))
AS

CURSOR T_CS FOR SELECT OWNER,OBJECT_NAME FROM ALL_OBJECTS WHERE OBJECT_TYPE='TABLE' AND OWNER='OA_01_TEST';
BEGIN

FOR T IN T_CS LOOP
PRINT  'SELECT '||COL||' FROM '||T.OWNER||'.'||T.OBJECT_NAME||' WHERE '||COL||'=15' ;
--EXECUTE IMMEDIATE  'SELECT '||COL||' FROM '||T.OWNER||'.'||T.OBJECT_NAME||' WHERE '||COL||'=15' ; --动态SQL
END LOOP;

END;

1.2、执行效果

CALL T_1208('ID');
执行成功, 执行耗时1毫秒. 执行号:2048
SELECT ID FROM OA_01_TEST.TEST_PRO WHERE ID=15

说明:用’…‘包住的是普通字符串的一个整体,那么这个’SELECT ‘||COL||’ FROM ‘||T.OWNER||’.’||T.OBJECT_NAME||’ WHERE ‘||COL||’=15’ 这条语句可以理解为,普通字符||变量||普通字符串||变量||普通字符串||…,其中||是连接符。

变量替换后带’ ’

2.1、创建存储过程

CREATE OR REPLACE PROCEDURE T_1208(COL VARCHAR(100))
AS
CURSOR T_CS FOR SELECT OWNER,OBJECT_NAME FROM ALL_OBJECTS WHERE OBJECT_TYPE='TABLE' AND OWNER='OA_01_TEST';
BEGIN

FOR T IN T_CS LOOP
PRINT  'SELECT '''||COL||''' FROM '''||T.OWNER||'''.'''||T.OBJECT_NAME||''' WHERE '''||COL||'''=15' ;
--EXECUTE IMMEDIATE 'SELECT '''||COL||''' FROM '''||T.OWNER||'''.'''||T.OBJECT_NAME||''' WHERE '''||COL||'''=15' ;--动态SQL
END LOOP;

END;

2.2、测试执行结果

CALL T_1208('ID');

2.2、结果消息

[执行语句1]:
CALL T_1208('ID')
执行成功, 执行耗时2毫秒. 执行号:2025
SELECT 'ID' FROM 'OA_01_TEST'.'TEST_PRO' WHERE 'ID'=15

影响了0条记录

说明:带入参数的结果为SELECT ‘ID’ FROM ‘OA_01_TEST’.‘TEST_PRO’ WHERE ‘ID’=15,这条语句是有语法问题。但是先抛开这个问题,先看’ ‘是怎么形成的。上一节的"说明"的我们应该这样写(PRINT ‘SELECT ‘||’’’||COL||’’’||’ FROM ‘||T.OWNER||’.’||T.OBJECT_NAME||’ WHERE ‘||COL’=15’ ;),但是由于’是特殊符号需要转义才是普通字符。所以这里吧’SELECT ‘’'看成一个整体,同时第二个’是用来转义第三个’字符的。

2.3、为什么费这么大劲说变量外加’ ’
如果变量输入的参数是数字但是字段的定义是char或者varchar等,那么就需要转义,如果变量外面有’ '那么就不再需要转义,从而提高一定的SQL语句性能。

3、变量替换后带" "

3.1、根据第一节说明的内容我们可以很快得到下面的存储过程

CREATE OR REPLACE PROCEDURE T_1208(COL VARCHAR(100))
AS

CURSOR T_CS FOR SELECT OWNER,OBJECT_NAME FROM ALL_OBJECTS WHERE OBJECT_TYPE='TABLE' AND OWNER='OA_01_TEST';
BEGIN

FOR T IN T_CS LOOP
PRINT  'SELECT '||'"'||COL||'"'||' FROM '||T.OWNER||'.'||T.OBJECT_NAME||' WHERE '||COL'=15' ;
--EXECUTE IMMEDIATE  'SELECT '||'"'||COL||'"'||' FROM '||T.OWNER||'.'||T.OBJECT_NAME||' WHERE '||COL'=15' ;--动态SQL
END LOOP;

END;

3.2、测试执行结果

CALL T_1208('ID');
执行成功, 执行耗时2毫秒. 执行号:2122
SELECT "ID" FROM OA_01_TEST.TEST_PRO WHERE =15

3.3、变量外加" "有什么好处呢

 CREATE USER 123 IDENTIFIED BY 1234567890;

上面语句会报下面错误

[执行语句1]:
create user 123 identified by 1234567890;
执行失败(语句1)
第 1 行, 第 22 列[123]附近出现错误[-2007]: 
语法分析出错

下面语句是不会报错

CREATE USER "123" IDENTIFIED BY 1234567890;

假如有一张学生的表,我要根据学生的学号(假如全是数字)作为账户创建校园网的账号,那么我们的" "就派上用场了。

链接: 达梦技术社区https://eco.dameng.com/.

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值