v_sql := 'create table temp_stu as select * from student'execute immediate v_sql;

解决方案 »

  1.   

    楼上方法可以,另可参考:
    create or replace function test return varchar2 as
        v_cursor number;
        v_string varchar2(200);
        v_row number;
    begin
        v_cursor:=dbms_sql.open_cursor;
        v_string:='create table testdb (text varchar2(200))';
        dbms_sql.parse(v_cursor,v_string,dbms_sql.native);
        v_row:=dbms_sql.execute(v_cursor);
        dbms_sql.close_cursor(v_cursor);
        return ('成功执行'||v_row||'行!');
        exception
            when others then
                dbms_sql.close_cursor(v_cursor);
                return ('执行失败!'||sqlcode||sqlerrm);
                raise;
    end;
      

  2.   

    因为pl/sql不能直接执行ddl语句,必须用动态的
      

  3.   

    很多事情不能自己想当然,要看书和查资料
     wylwyl1130(落雪山林) 告诉你了
    ---------------------
    The Need for Dynamic SQL
    You need dynamic SQL in the following situations:
    n You want to execute a SQL data definition statement (such as CREATE), a data
    control statement (such as GRANT), or a session control statement (such as
    ALTER SESSION). In PL/SQL, such statements cannot be executed statically.
    n You want more flexibility. For example, you might want to defer your choice of
    schema objects until run time. Or, you might want your program to build
    different search conditions for the WHERE clause of a SELECT statement. A more
    complex program might choose from various SQL operations, clauses, etc.
    n You use package DBMS_SQL to execute SQL statements dynamically, but you
    want better performance, something easier to use, or functionality that DBMS_
    SQL lacks such as support for objects and collections. (For a comparison with
    DBMS_SQL, see Oracle8i Application Developer’s Guide - Fundamentals.)
    -----------------------
    EXECUTE IMMEDIATE dynamic_string
    [INTO {define_variable[, define_variable]... | record}]
    [USING [IN | OUT | IN OUT] bind_argument
    [, [IN | OUT | IN OUT] bind_argument]...]
    [{RETURNING | RETURN} INTO bind_argument[, bind_argument]...];
    --------------------
    CREATE PROCEDURE delete_rows (
    table_name IN VARCHAR2,
    condition IN VARCHAR2 DEFAULT NULL) AS
    where_clause VARCHAR2(100) := ’ WHERE ’ || condition;
    BEGIN
    IF condition IS NULL THEN where_clause := NULL; END IF;
    EXECUTE IMMEDIATE ’DELETE FROM ’ || table_name || where_clause;
    EXCEPTION
    ...
    END;------------------------
    CREATE PROCEDURE drop_table (table_name IN VARCHAR2) AS
    BEGIN
    EXECUTE IMMEDIATE ’DROP TABLE :tab’ USING table_name;
    END;
    --------------
      

  4.   

    因为pl/sql不能直接执行ddl语句,必须用动态的
      那确实!
      

  5.   

    请问select * from table 这句应该是dml语句啊,可是为什么下面的语句块执行不了呢?
    begin
     select * from student;
    end;
      

  6.   

    由于过程等后台函数中不能使用createtable droptable 等DDL语句,必须用动态的
    declare 
     v_char  varchar(50);
     ls_sql varchar2(1000);
    begin
     
     ls_sql :='create table temp_stu as select * from student';
    execute immediate ls_sql;
     --v_char:='ok';
    end;