oracle 如何解决:- PLS-00103:在需要以下内容之一时遇到符号“文件结束”:开始结束函数杂注过程

4si2a6ki  于 2023-04-20  发布在  Oracle
关注(0)|答案(1)|浏览(144)

需要通过添加一列来改变表,我们如何编写正确的语法来改变包内的表?它可以是过程或函数?
我尝试使用过程并得到此错误

CREATE OR REPLACE PACKAGE BODY temp IS

  PROCEDURE prc_proc_add_column(
                                 table_name  IN user_tab_columns.TABLE_NAME%TYPE,
                                 p_return    OUT NUMBER,
                                 p_message   OUT VARCHAR2
                               ) IS   
  BEGIN
      EXECUTE IMMEDIATE 'ALTER TABLE table_name ADD col_name NUMBER';
     p_return  := 0;
     p_message := 'Succesful';
    EXCEPTION WHEN OTHERS THEN p_return  := SQLCODE;
                               p_message := SQLERRM;        
  END prc_proc_add_column;

然后得到这个错误:-

PLS-00103: Encountered the symbol "end-of-file" when expecting one of      
the following: begin end function pragma procedure
liwlm1x9

liwlm1x91#

Barbaros已经评论了你发布的代码的错误,就语法而言。
当然,您可以这样做,但是-一般来说-动态地修改数据模型并不是最好的主意。
当您在这里时,为什么不修改代码,以便不仅可以提供表名,还可以提供列名及其数据类型呢?
请注意,当在DDL语句上使用动态SQL时,必须将名称连接到语句中;你不能使用绑定变量(不是你做的那样…),而且--一般来说--如果你注意可能的SQL注入,这不会有什么坏处。
举个例子
Package 规格:

SQL> CREATE OR REPLACE PACKAGE temp
  2  IS
  3     PROCEDURE prc_proc_add_column (
  4        p_table_name   IN     user_tab_columns.table_name%TYPE,
  5        p_column_name  IN     user_tab_columns.column_name%TYPE,
  6        p_datatype     IN     user_tab_columns.data_type%TYPE,
  7        p_return          OUT NUMBER,
  8        p_message         OUT VARCHAR2);
  9  END;
 10  /

Package created.

包体:

SQL> CREATE OR REPLACE PACKAGE BODY temp
  2  IS
  3     PROCEDURE prc_proc_add_column (
  4        p_table_name   IN     user_tab_columns.table_name%TYPE,
  5        p_column_name  IN     user_tab_columns.column_name%TYPE,
  6        p_datatype     IN     user_tab_columns.data_type%TYPE,
  7        p_return          OUT NUMBER,
  8        p_message         OUT VARCHAR2)
  9     IS
 10        l_str  VARCHAR2 (200);
 11     BEGIN
 12        l_str :=
 13              'ALTER TABLE '
 14           || DBMS_ASSERT.sql_object_name (p_table_name)
 15           || ' ADD '
 16           || DBMS_ASSERT.simple_sql_name (p_column_name)
 17           || ' '
 18           || DBMS_ASSERT.simple_sql_name (p_datatype);
 19
 20        EXECUTE IMMEDIATE l_str;
 21
 22        p_return := 0;
 23        p_message := 'Succesful';
 24     EXCEPTION
 25        WHEN OTHERS
 26        THEN
 27           p_return := SQLCODE;
 28           p_message := SQLERRM;
 29     END prc_proc_add_column;
 30  END;
 31  /

Package body created.

测试:

SQL> CREATE TABLE test
  2  (
  3     id   NUMBER
  4  );

Table created.

SQL> DECLARE
  2     l_ret  VARCHAR2 (200);
  3     l_msg  VARCHAR2 (200);
  4  BEGIN
  5     temp.prc_proc_add_column ('test',
  6                               'salary',
  7                               'number',
  8                               l_ret,
  9                               l_msg);
 10     DBMS_OUTPUT.put_line (l_ret || ': ' || l_msg);
 11  END;
 12  /

PL/SQL procedure successfully completed.

SQL> desc test
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER
 SALARY                                             NUMBER

SQL>

相关问题