如何写一oracle存储过程来动态create表...其中的列名是通过参数传过来的..而且都是不确定个数...
解决方案 »
- 菜鸟弱弱的问下Oracle与SqlServer最大的区别是什么
- 请问一个关于insert into的问题
- Oracle 存储过程 未找到要求的From关键字错误
- 一个查询语句,请各位帮帮忙。
- 表的索引
- 急!!!无法为表空间MOF中的段创建 INITIAL 区
- 怎样实现这种效果
- 为什么一条语句执行很快,相似的另一条很慢~~
- 请问一下(shutdown immediate)和(shutdown abort)的区别。
- 字符集问题,如何将一个us7ascii的数据库导入到一个ZHS16CGB231280的数据库?
- ORA-02291:我遇到这个错误很奇怪!
- oracle实现从表里导出到EXCEL文件怎么做?
-- 创建一个内嵌表的类型
CREATE OR REPLACE PACKAGE PKG_TYPES AS
TYPE col_definitions IS TABLE OF VARCHAR2(30);
END PKG_TYPES;-- 只处理了表名和字段,没有约束,主键等,楼主有兴趣可以自己试着加进去
CREATE OR REPLACE PROCEDURE prc_create_table(
p_table_name VARCHAR2,
p_columns PKG_TYPES.col_definitions
) AS
v_sql VARCHAR2(4000);
BEGIN
v_sql := 'CREATE TABLE ' || p_table_name || ' (';
FOR i IN p_columns.FIRST .. p_columns.LAST LOOP
v_sql := v_sql || p_columns(i);
IF i != p_columns.LAST THEN
v_sql := v_sql || ',';
END IF;
END LOOP;
v_sql := v_sql || ')';
EXECUTE IMMEDIATE v_sql;
EXCEPTION
WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;-- 测试创建一个表
BEGIN
prc_create_table('MYTEST_TABLE', PKG_TYPES.col_definitions('id number','name varchar2(20)','birth_date date'));
END;-- 显示结果
desc mytest_table;
TABLE mytest_table
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
NAME VARCHAR2(20)
BIRTH_DATE DATE
CallableStatement cstmt =conn.prepareCall("{call prc_create_tablety}") ;
cstmt.executeUpdate();
这里参数怎么传进去?
-- 创建一个内嵌表的类型
CREATE TYPE col_definitions IS TABLE OF VARCHAR2(30);-- 创建一个存储过程来创建表
CREATE OR REPLACE PROCEDURE prc_create_table(
p_table_name VARCHAR2,
p_columns col_definitions
) AS
v_sql VARCHAR2(4000);
BEGIN
v_sql := 'CREATE TABLE ' || p_table_name || ' (';
FOR i IN p_columns.FIRST .. p_columns.LAST LOOP
v_sql := v_sql || p_columns(i);
IF i != p_columns.LAST THEN
v_sql := v_sql || ',';
END IF;
END LOOP;
v_sql := v_sql || ')';
EXECUTE IMMEDIATE v_sql;
EXCEPTION
WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
// 准备一个数组
String[] cols = {"id number","name varchar2(20)","birth_date date"};// 获取数据库连接
Connection conn = OracleHelper.getConnection();// 创建一个数组描述实例
ArrayDescriptor arraydesc = ArrayDescriptor.createDescriptor("col_definitions".toUpperCase(), conn);// 创建一个oracle.sql.ARRAY数组
ARRAY array= new ARRAY(arraydesc, conn, cols);// 调用存储过程
CallableStatement cstmt = conn.prepareCall("{call prc_create_table(?,?)}");// 设置参数
cstmt.setString(1, "MY_TEST_TABLE");
cstmt.setArray(2, array);// 执行
cstmt.execute();
conn.close();
EXCEPTION
WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLERRM);
去除,可能出错了,没显示错误代码来
java.sql.SQLException: ORA-00904: : 无效的标识符
ORA-06512: 在"DAYANDEV.PRC_CREATE_TABLE", line 19
ORA-06512: 在line 1