oracle 的pl/sql中不支持数据操作语言,所以如果想这么做,只能通过动态sql,有2中
1。本地动态sql。
l_str:='create table a ..';
execute immediate(l_str);
2.dbms_sql包。
给你一个我的动态建立seq的脚本研究一把
cursor_i:=dbms_sql.open_cursor;
l_sql:='create sequence '||l_table_name||'_seq increment by 1 start with '
||to_char(l_max_id)||' minvalue 1 maxvalue 999999999999999999999999999 nocycle noorder cache 20';
DBMS_SQL.PARSE(cursor_i,l_sql,DBMS_SQL.NATIVE);
cursor_ret:=dbms_sql.execute(cursor_i);
dbms_sql.close_cursor(cursor_i);
1。本地动态sql。
l_str:='create table a ..';
execute immediate(l_str);
2.dbms_sql包。
给你一个我的动态建立seq的脚本研究一把
cursor_i:=dbms_sql.open_cursor;
l_sql:='create sequence '||l_table_name||'_seq increment by 1 start with '
||to_char(l_max_id)||' minvalue 1 maxvalue 999999999999999999999999999 nocycle noorder cache 20';
DBMS_SQL.PARSE(cursor_i,l_sql,DBMS_SQL.NATIVE);
cursor_ret:=dbms_sql.execute(cursor_i);
dbms_sql.close_cursor(cursor_i);
解决方案 »
- 两个应用系统通过“中间表”进行数据交互,该如何设计?
- tomcat和oracle启动时发生8080端口冲突,怎样通过修改oracle默认端口使之不冲突?
- 谁能帮忙优化一下这个sql查询语句,谢谢!
- oracle的触发器问题
- 请教一个sql loader 导入txt文件的问题!!
- oracle的用户名和密码错误是怎么回事?
- oracle如何在字符串中寻找回车符
- 问高人存储过程每月执行一次,运用的是带参数的过程如何更改。特急!
- unable to extend index PAS.SYS_C009381 by 3596 in tablespace NEMS?
- Oracle中,如何对查询的数据进行报表打印?
- 哪位大虾能提供有关与SQL LOADER方面得资料
- sql语句
dbms_sql包可以在oracle中的存储过程中调用。不知能不能帮到你
create or replace Procedure generateTable(TableName in varchar2)
is
begin
create table office (
OfficeNum VARCHAR2(6) not null,
OfficeName VARCHAR2(80) not null,
constraint PK_OFFICE primary key (OfficeNum)
);
end generateTable
is
begin
l_str:='create table '||tablename||'(OfficeNum VARCHAR2(6) not null,OfficeName VARCHAR2(80) not null,
constraint PK_OFFICE primary key (OfficeNum)
);' cursor_i:=dbms_sql.open_cursor;
DBMS_SQL.PARSE(cursor_i,l_str,DBMS_SQL.NATIVE);
cursor_ret:=dbms_sql.execute(cursor_i);
dbms_sql.close_cursor(cursor_i);end;
end generateTable不就ok了么??
警告:已创建的过程出现编译错误。我看上面的代码似乎l_str应该声明(declare)吧,还有cursor_i等,是不是也需要声明?
我装的是Oracle8.05。你上面的代码执行通过了?
is
str varchar2(100);
begin
str:='create table '||p_tablename||'(
OfficeNum VARCHAR2(6) not null,
OfficeName VARCHAR2(80) not null,
constraint PK_OFFICE primary key (OfficeNum)
)'; --grant create any table to your_user
execute immediate str;
end generateTable;
/
execute immediate 的用法好像是Oracle8i才有,我现在用的Oracle版本是Oracle8.05所以,还是没有编译通过。
PROCEDURE GENERATETABLE出现错误:LINE/COL ERROR
-------- -----------------------------------------------------------------
10/9 PLS-00103: 出现符号"IMMEDIATE"在需要下列之一时:
:=.(@%;
2 is
3 l_str varchar2(1000);
4 cursor_i INTEGER;
5 cursor_ret INTEGER;
6 begin
7 l_str:='create table '||TableName||' (nameZ VARCHAR2(6) not null,ageZ VARCHAR2(80) not null);
';
8 cursor_i:=dbms_sql.open_cursor;
9 DBMS_SQL.PARSE(cursor_i,l_str,DBMS_SQL.NATIVE);
10 cursor_ret:=dbms_sql.execute(cursor_i);
11 dbms_sql.close_cursor(cursor_i);
12 end generateTable;
13 /过程已创建。SQL> execute generateTable('testOK');
begin generateTable('testOK'); end;*
错误位于第1行:
ORA-00911: 无效字符
ORA-06512: 在"SYS.DBMS_SYS_SQL", line 491
ORA-06512: 在"SYS.DBMS_SQL", line 32
ORA-06512: 在"TEST.GENERATETABLE", line 9
ORA-06512: 在line 1
Execute IMMEDIATE
DBMS_SQL包
能Delphi调用的是存储过程名。不用调DBMS_SQL。
2 is
3 l_str varchar2(1000);
4 cursor_i INTEGER;
5 cursor_ret INTEGER;
6 begin
7 l_str:='create table ' || TableName || ' (nameZ varchar2(50) not null,ageZ varchar2(80))';
8 cursor_i:=dbms_sql.open_cursor;
9 DBMS_SQL.PARSE(cursor_i,l_str,DBMS_SQL.NATIVE);
10 cursor_ret:=dbms_sql.execute(cursor_i);
11 dbms_sql.close_cursor(cursor_i);
12 end generateTable;
13 /过程已创建。SQL> execute generateTable('test10');
begin generateTable('test10'); end;*
错误位于第1行:
ORA-01031: 权限不足
ORA-06512: 在"SYS.DBMS_SYS_SQL", line 491
ORA-06512: 在"SYS.DBMS_SQL", line 32
ORA-06512: 在"TEST.GENERATETABLE", line 9
ORA-06512: 在line 1
在Oracle中,可以使用DBMS_SQL包和execute immediate ‘……’来执行动态SQL,不过要注意的是execute immediate是Oracle8i才推出的新特性,在Oracle8及以前的版本中是不能用这种方式的.
因为我用的数据库系统是Oracle8.05,所以只能使用DBMS_SQL包;
同时为了生成表,必须 grant create table to 用户