首页 > 解决方案 > 将 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 

标签: sqloracleplsqldynamic-sql

解决方案


缺少逗号(子句中的表之间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'

看起来不错,但是一旦执行它就会知道。我不能,没有你的桌子。


推荐阅读