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