在写动态sql时,里面有一个单引号,两个单引号,三个单引号,四个单引号,也有更多,但是不常见。
有基础,忘记的直接看最后一页的图片,找奇数个数引号对齐,然后两个转义一个
SELECT *
FROM ALL_TAB_PARTITIONS
WHERE partition_name = 'PART_20250628'
上述代码中,where后的判断语句用的单引号,单引号中的内容是区分大小写的。
写动态sql拆分成三个部分 partition_name = 'PART_V_DATE'
动态sql:
EXECUTE IMMEDIATE '
SELECT count(1)
FROM ALL_TAB_PARTITIONS
WHERE table_name = ''DWA_SX_CITY_D_NEW_USERS''
AND table_owner = ''ZB_DWA''
AND partition_name = ''PART_'||V_DATE||'''' INTO V_COUNT;
EXECUTE IMMEDIATE
是一个用于执行动态 SQL 语句的命令。
我喜欢叫他开启动态sql的标志,这个后面的动态sql内容就用单引号 ' ' 来括住。
所以说下面这段代码就是sql的第一部分
'
SELECT count(1)
FROM ALL_TAB_PARTITIONS
WHERE table_name = ''DWA_SX_CITY_D_NEW_USERS''
AND table_owner = ''ZB_DWA''
AND partition_name = ''PART_'
上述是第一部分
单引号中的内容可以理解为字符串,字符串的拼接就用 ||
所以说第二部分就是 V_DATE的值
第三部分两个单引号开启动态sql: ' 内容 '
这里面的内容就一个单引号,但是因为在动态sql的引号中,所以两个单引号转义为一个单引号。
我的读动态sql方法
一部分代码拿出来学习
-- 条件判断1 原始分区是否存在
EXECUTE IMMEDIATE '
SELECT count(1)
FROM ALL_TAB_PARTITIONS
WHERE table_name = ''DWA_SX_CITY_D_NEW_USERS''
AND table_owner = ''ZB_DWA''
AND partition_name = ''PART_'||V_DATE||'''' INTO V_COUNT;
IF V_COUNT != 1 THEN
V_SQL := 'ALTER TABLE ZB_DWA.DWA_SX_CITY_D_NEW_USERS ADD PARTITION PART_'||V_DATE||' VALUES LESS THAN ('''||V_DATE_A1||''')
TABLESPACE TBS_ZB_DWA';
EXECUTE IMMEDIATE V_SQL;
END IF;
-- 条件判断2 - 原始数据是否存在
EXECUTE IMMEDIATE '
SELECT COUNT(*)
FROM ZB_DWD.DWD_D_USE_BASE_INFO
WHERE date_id ='''|| V_DATE ||'''
AND rownum < 2
'
into
V_COUNT;
直接看 if 下面 V_SQL的内容
V_SQL:=' 开启动态sql,看到单引号,直接找后面的奇数引号,中间内容先不管
V_SQL := 'ALTER TABLE ZB_DWA.DWA_SX_CITY_D_NEW_USERS ADD PARTITION PART_'
||
V_DATE
||
' VALUES LESS THAN ('' ' || V_DATE_A1 || ' '' ) TABLESPACE TBS_ZB_DWA ';
('''
表示字符串 ('
||V_DATE_A1||
拼接日期值变量
''')
表示字符串 ')
有问题评论区