PL SQL创建包含连接字段的表

时间:2017-01-05 10:38:55

标签: sql oracle plsql

我需要创建一个表并为每个字段添加某些字符。 我需要将每个字段括在""我还需要将字段分隔为管道 我的代码如下

Begin
execute immediate 'Create Table dbo.Temp_Weekly_Export_File as
Select ''"'' ||A.unique_id || ''"|'' as unique_id,
   ''"'' ||A.name || ''"|'' as name,
   ''"'' ||A.alt_name || ''"|'' as alt_name,
   ''"'' ||A.entity_type || ''"|'' as entity_type, 
   ''"'' ||A.party_type || ''"|'' as party_type,
   ''"'' ||A.reference_# || ''"|'' as reference_#, 
   ''"'' ||A.addr1 || ''"|'' as addr1 ,
   ''"'' ||A.addr2 || ''"|'' as addr2,
   ''"'' ||A.addr3 || ''"|'' as addr3,
   ''"'' ||A.town || ''"|'' as town,
   ''"'' ||A.county || ''"|'' as county,
   ''"'' ||A.postcode || ''"|'' as postcode, 
   ''"'' ||A.country || ''"|'' as country,
   ''"'' ||A.alt_address1 || ''"|'' as alt_address1, 
   ''"'' ||A.alt_address2 || ''"|'' as alt_address2,
   ''"'' ||A.alt_address3|| ''"|'' as alt_address3, 
   ''"'' ||A.alt_town || ''"|'' as alt_town,
   ''"'' ||A.alt_county || ''"|'' as alt_county, 
   ''"'' ||A.alt_post_code || ''"|'' as alt_post_code,
   ''"'' ||A.alt_country || ''"|'' as alt_country, 
   ''"'' ||A.nationality || ''"|'' as nationality,
   ''"'' ||A.dob || ''"|'' as dob,
   ''"'' ||A.individual_id || ''"|'' as individual_id,
   ''"'' ||A.individual_id_type || ''"|'' as individual_id_type ,
   ''"'' ||A.country_of_registration|| ''"|'' as country_of_registration, 
   ''"'' ||A.company_id || ''"|'' as company_id,
   ''"'' ||A.company_id_type || ''"|'' as company_id_type  ,
   ''"'' ||A.source_country || ''"|'' as source_country,
   ''"'' ||A.source_system || ''"|'' as source_system,
   ''"'' ||A.transaction_type|| ''"|'' as transaction_type
   From dbo.Temp_Weekly_Export A';
   End;

我收到以下错误消息10:22:26 ORA-00923:未找到FROM关键字

3 个答案:

答案 0 :(得分:2)

无需显式写入所有列名称,您可以使用以下

<强>设定:

create table source(colA, colB, colC) as (
    select 1, 2, 3 from dual union all
    select 4, 5, 6 from dual
)

plsql:

declare
    vSQL varchar2(1000);
begin

    select 'select ' || rtrim(listagg('''"''||' || column_name || '||''"|'' as ' || column_name || ',') within group ( order by column_name), ',') || ' from ' || table_name
    into vSQL
    from user_tab_columns
    where table_name = 'SOURCE'          
    group by table_name;
    --
    vSQL := 'create table target as ' || vSQL;
    execute immediate vSQL;
end;

结果:

SQL> select * from target;

COLA       COLB       COLC
---------- ---------- ----------
"1"|       "2"|       "3"|
"4"|       "5"|       "6"|

答案 1 :(得分:1)

见下面的例子。您只需要在'

附近"
declare
var varchar2(2000);
BEGIN

 var:= 'Create  Table Temp_Weekly_Export_File as
        Select ''"'' ||UNIQUE_ID|| ''"|'' as unique_id,
         ''"'' ||NAME || ''"|'' as name
         From Test ';

   --dbms_output.put_line(var);
     EXECUTE IMMEDIATE var;

END;

演示:

SQL> CREATE TABLE  TEST
(
  UNIQUE_ID  VARCHAR2(103 CHAR),
  NAME       VARCHAR2(103 CHAR)
);

Table created.

SQL> declare
var varchar2(2000);
BEGIN

 var:= 'Create  Table Temp_Weekly_Export_File as
        Select ''"'' ||UNIQUE_ID|| ''"|'' as unique_id,
         ''"'' ||NAME || ''"|'' as name
         From Test ';

    --dbms_output.put_line(var);
    EXECUTE IMMEDIATE var;

END;  
  /

PL/SQL procedure successfully completed.

SQL> select * from Temp_Weekly_Export_File;

no rows selected

答案 2 :(得分:0)

我喜欢ALEKSEJ的回答。每当我必须使用双引号时,我都会替换Q引用语法。我发现阅读和更改更容易。我不再需要加倍报价。以下是使用Q引号的Alek解决方案:

BEGIN
      SELECT    'select '
             || RTRIM (
                    LISTAGG (q'['"' ||]' ||  column_name || q'[||'"|' as ]' || column_name || ',')
                        WITHIN GROUP (ORDER BY column_name)
                  , ','
                )
             || ' from '
             || table_name
        INTO vsql
        FROM user_tab_columns
       WHERE table_name = 'SOURCE'
    GROUP BY table_name;

    --
    vsql   := 'create table target as ' || vsql;

    EXECUTE IMMEDIATE vsql;
END;

Q引号可以包含配对符号

  

q&#39; []&#39;,q&#39; {}&#39;,q&#39;&lt; &gt;&#39;或q&#39;()&#39;

相关问题