name,是外部变量 ,比如:create or replace procedure pname ( name varchar2 ) as begin .... end;

解决方案 »

  1.   

    在PL/SQL中使用 SQL 
      1. SQL语句的分类 
      SQL语句可以五类: 
      数据操纵语言(DML):用来改变表中已有的数据或者查询数据库表中的数据,但是不会改变表,或者其他对象的结构。 
      数据定义语言(DDL):用来创建、删除或者改变某数据模式对象的结构。更改数据模式对象的权限命令也是DDL。 
      事务控制语句:将SQL语句组织成逻辑事务,事务中的语句作为一个整体执行,或者全部成功或者全部失败。这保证了数据的一致性。 
      会话控制语句:会改变单个数据库会话的设置——例如,启用SQL跟踪或启动一个事件。 
      系统控制语句:会改变整个数据库的设置——例如,启用或禁用存档。 
      类别 
      SQL语句范例 
       
      数据操纵语言(DML) 
      SELECT、INSERT、UPDATE、DELETE、EXPLAIN PLAN 
       
      数据定义语言(DDL) 
      DROP、CREATE、ALTER、GRANT、REVOKE 
       
      事务控制 
      COMMIT、ROLLBACK、SAVEPOINT、SET TRANSACTION 
       
      会话控制 
      ALTER SESSION、SET ROLE 
       
      系统控制 
      ALTER SYSTEM 
       
      2. 在PL/SQL中使用 SQL 
       在PL/SQL中可以直接使用的SQL语句只有DML和事务控制语句,(EXPLAIN PLAIN 尽管属于DML,但使用他也是非法的)要使用DDL语句的话,必须使用动态SQL。 
      为什么会这样?我们先看一下PL/SQL的设计方法。 
      2.1 PL/SQL的设计方法——早邦定 
       大家知道,程序设计语言按照两种方式邦定变量——早期邦定和后期邦定。邦定变量是识别程序中标示符存储位置的过程。在PL/SQL中还包括检查数据库得到访问引用对象的权限。(即在编译期间确定对象的权限,并与其标示符相邦定) 
       PL/SQL在设计时特别采用了早期邦定。这样,一个语句块的执行将尽变快,因为所有的数据库对象在运行前都已经被编译器所确定。这样设计的结果是,DDL语句被禁止使用了。因为DDL语句会修改数据库对象,而数据库对象的权限是在编译期间决定的。 
       下面举例子说明: 
       BEGIN 
       CREATE TABLE temp_table( 
       num_value NUMBER, 
       char_value CHAR(10); 
       INSERT INTO temp_table(num_value,char_value) values (10,’HELLO’); 
       END; 
       在编译这个语句块时,temp_table标示符必须是邦定过的。于是这个过程将检查该表是否存在,但是该表在被运行之前是不会存在的。所以编译通不过,因为该语句块不能被编译,所以他也不可能运行。 
      2.2 使用动态SQL语句 
       这样,要在PL/SQL中使用DDL语句,就必须使用动态SQL语句。什么是动态SQL语句? 
       动态SQL语句允许你在运行时动态生成SQL语句,然后对其进行分析并执行。因为语句在运行之前并位创建出来,所以PL/SQL编译器不必邦定语句中的标示符,这样整个语句就可以通过编译。 
       例如上面的例子: 
       BEGIN 
       EXECUTE IMMEDIATE ‘CREATE TABLE temp_table( 
       num_value NUMBER, 
       char_value CHAR(10)’; 
       EXECUTE IMMEDIATE ‘INSERT INTO temp_table(num_value,char_value) values (10,’HELLO’)’; 
       END;参考http://www.wangchao.net.cn/bbsdetail_754121.html
      

  2.   

    要把name 作为 字符,在 procedure 中拼成可运行的 SQL字符串。然后调用楼上的方法 EXECUTE IMMEDIATE 即可。
    不过确保拼完的SQL是可运行的。最好捕获下异常。防止程序崩溃