【问题标题】:Convert SQL Query to Dynamic SQL将 SQL 查询转换为动态 SQL
【发布时间】:2021-05-24 15:29:23
【问题描述】:

我需要将我的普通 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 

【问题讨论】:

    标签: sql oracle plsql dynamic-sql


    【解决方案1】:

    缺少逗号(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'
    

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

    【讨论】:

    • 您好 Littlefoot,它工作正常,非常感谢您的快速响应。问候,轭
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    相关资源
    最近更新 更多