sql - 将 SQL 查询转换为动态 SQL
问题描述
我需要将我的普通 SQL 查询转换为动态 sql,任何人都可以参考下面的 SQL 查询,我已经发布了我在执行动态 sql 时遇到的错误
SQL查询:
insert into p_table_name(
select col001, col002, col003, col004, col005,
col006, col007, col008, col009, col010 AS l_columns_item ,
-- more columns (col011 to col300) can be selected here.
from apex_application_temp_files f,
table( apex_data_parser.parse(
p_content => f.blob_content,
p_file_name => f.filename ) ) p
where f.name = p_file_name
)
符合预期的动态 SQL 查询。
IF p_table_name = 'DUMMY_TABLE' THEN
l_columns_item := 'c001,c002,c003,c004,c005,c006' || ',c007,c008,c009';
END IF;
l_ddl := 'insert into '||p_table_name||' '||
'select '||l_columns_item||' '||
'from apex_application_temp_files f'||
' table( apex_data_parser.parse(
p_content => f.blob_content,
p_file_name => f.filename ) ) p'
'where f.name ='''||p_file_name||'''';
execute immediate l_ddl;
RETURN;
我得到的错误:
Error(432,1): PLS-00103: Encountered the symbol " " when expecting one of the following: * & = - + ; < / > at in is mod remainder not rem <an exponent (**)> <> or != or ~= >= <= <> and or like like2 like4 likec between || member submultiset
解决方案
缺少逗号(子句中的表之间FROM
)和子句前面的空格 + 连接符号WHERE
。
使用动态 SQL 时,不要立即执行该语句 - 先显示它,确保它正确,然后执行它。
l_ddl :=
'insert into '
|| p_table_name
|| ' '
|| 'select '
|| l_columns_item
|| ' '
|| 'from apex_application_temp_files f, '
|| ' table( apex_data_parser.parse(
p_content => f.blob_content,
p_file_name => f.filename ) ) p '
|| 'where f.name ='''
|| p_file_name
|| '''';
DBMS_OUTPUT.put_line (l_ddl); --> display it first
然后(格式化)结果是
INSERT INTO test
SELECT c001,
c002,
c003,
c004,
c005,
c006,
c007,
c008,
c009
FROM apex_application_temp_files f,
TABLE (
apex_data_parser.parse (p_content => f.blob_content,
p_file_name => f.filename)) p
WHERE f.name = 'file'
看起来不错,但是一旦执行它就会知道。我不能,没有你的桌子。
推荐阅读
- ti-basic - 如何在循环中使用嵌套的 while 循环?
- python - 错误:需要类似字节的对象,而不是 pd.read_csv 上的“str”
- python - 将数据框列中的时间戳与熊猫进行比较
- python - 将多个csv文件上传到python中的sharepoint文件夹?
- jquery - 使用具有不同值的 jQuery 定位多个输入
- python - 用dataframe重写sql查询;如何从选择中混合不同的来源
- algorithm - 用于字符串匹配的 Rabin-Karp 方法
- sql - 自动分区我们用来手动添加分区的现有表,方法是在 Oracle 中拆分最大分区
- .net - 如何模拟 Autofac.Multitenant.MultitenantContainer.ConfigureTenant
- python - Django 原子事务适用于 sqlite,但不适用于 postgresql