【问题标题】:Two PLSQL statements with begin and end, run fine separately but not together?两个带有开始和结束的PLSQL语句,单独运行但不能一起运行?
【发布时间】:2011-03-02 18:02:20
【问题描述】:

只是想知道是否有人可以提供帮助,我有两个用于更改表(添加额外字段)的 PLSQL 语句,它们如下:

-- Make GC_NAB field for Next Action By Dropdown

begin
if 'VARCHAR2' = 'NUMBER' and length('VARCHAR2')>0 and length('')>0 then
  execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NAB VARCHAR2(10, ))';
elsif ('VARCHAR2' = 'NUMBER' and length('VARCHAR2')>0 and length('')=0) or
  'VARCHAR2' = 'VARCHAR2' then
  execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NAB VARCHAR2(10))';
else
  execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NAB VARCHAR2)';
end if;
commit;
end;

-- Make GC_NABID field for Next Action By Dropdown

begin
if 'NUMBER' = 'NUMBER' and length('NUMBER')>0 and length('')>0 then
  execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NABID NUMBER(, ))';
elsif ('NUMBER' = 'NUMBER' and length('NUMBER')>0 and length('')=0) or
  'NUMBER' = 'VARCHAR2' then
  execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NABID NUMBER())';
else
  execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NABID NUMBER)';
end if;
commit;
end;

当我分别运行这两个查询时,没有问题。但是,如上图一起运行时,Oracle在启动第二条语句时给了我一个错误:

Error report:
ORA-06550: line 15, column 1:
PLS-00103: Encountered the symbol "BEGIN" 
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

我假设这意味着第一个语句没有正确终止......我应该在语句之间添加什么以使其正常工作吗?

【问题讨论】:

    标签: oracle plsql oracle10g statements


    【解决方案1】:

    Oracle 一次可以使用一条 SQL 语句或 PL/SQL 匿名块。 (不像 SQL Server 一次只能处理一个批处理。)所以,你有几个选择。

    1. 将两个匿名块包装在另一个匿名块中:

      begin
        -- Make GC_NAB field for Next Action By Dropdown 
        begin 
        if 'VARCHAR2' = 'NUMBER' and length('VARCHAR2')>0 and length('')>0 then 
          execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NAB VARCHAR2(10, ))'; 
        elsif ('VARCHAR2' = 'NUMBER' and length('VARCHAR2')>0 and length('')=0) or 
          'VARCHAR2' = 'VARCHAR2' then 
          execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NAB VARCHAR2(10))'; 
        else 
          execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NAB VARCHAR2)'; 
        end if; 
        commit; 
        end; 
        -- Make GC_NABID field for Next Action By Dropdown 
        begin 
        if 'NUMBER' = 'NUMBER' and length('NUMBER')>0 and length('')>0 then 
          execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NABID NUMBER(, ))'; 
        elsif ('NUMBER' = 'NUMBER' and length('NUMBER')>0 and length('')=0) or 
          'NUMBER' = 'VARCHAR2' then 
          execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NABID NUMBER())'; 
        else 
          execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NABID NUMBER)'; 
        end if; 
        commit; 
        end;
      end;
      
    2. 告诉您用于将 PL/SQL 提交给 Oracle 的工具分别发送这两个块。如何做到这一点将是特定于工具的。在 SQL*PLUS 中,单独一行上的 / 将完成此操作:

        -- Make GC_NAB field for Next Action By Dropdown 
        begin 
        if 'VARCHAR2' = 'NUMBER' and length('VARCHAR2')>0 and length('')>0 then 
          execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NAB VARCHAR2(10, ))'; 
        elsif ('VARCHAR2' = 'NUMBER' and length('VARCHAR2')>0 and length('')=0) or 
          'VARCHAR2' = 'VARCHAR2' then 
          execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NAB VARCHAR2(10))'; 
        else 
          execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NAB VARCHAR2)'; 
        end if; 
        commit; 
        end; 
        /
        -- Make GC_NABID field for Next Action By Dropdown 
        begin 
        if 'NUMBER' = 'NUMBER' and length('NUMBER')>0 and length('')>0 then 
          execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NABID NUMBER(, ))'; 
        elsif ('NUMBER' = 'NUMBER' and length('NUMBER')>0 and length('')=0) or 
          'NUMBER' = 'VARCHAR2' then 
          execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NABID NUMBER())'; 
        else 
          execute immediate 'alter table "SERVICEMAIL6"."ETD_GUESTCARE" add(GC_NABID NUMBER)'; 
        end if; 
        commit; 
        end;
        /
      

    【讨论】:

      【解决方案2】:

      是的,您需要在每个 end; 之后的行上添加一个斜杠 /

      【讨论】:

        【解决方案3】:

        可以通过两种方式实现

        1) 在 pl/sql 文件中分别运行这两个块。

        2) 在主块中,您可以通过这种方式运行两个 sbu 块:

        begin  // main block
              begin 
               .....   [pl/sql commands]
               ......
              end
              begin   
              .......  [pl/sql commands]
              .......
              end
        end // main ends
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-07-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-03
          • 1970-01-01
          • 2020-10-25
          相关资源
          最近更新 更多