Álv*_*lez 3 oracle ddl plsql oracle-xe oracle11g
我使用Oracle XE的唯一目的是开发PHP应用程序,而版本11g显然已经丢失了GUI工具来管理10g曾经拥有的用户,所以我想准备一个代码片段来从命令行创建用户.我正在尝试定义变量,所以我不需要输入相同的用户名16次,但我无法正确使用语法:
DECLARE
my_user VARCHAR2(30) := 'foo';
my_password VARCHAR2(9) := '1234';
BEGIN
CREATE USER my_user IDENTIFIED BY my_password DEFAULT TABLESPACE users;
GRANT CONNECT, RESOURCE TO my_user;
GRANT CREATE DATABASE LINK TO my_user;
GRANT CREATE MATERIALIZED VIEW TO my_user;
GRANT CREATE PROCEDURE TO my_user;
GRANT CREATE PUBLIC SYNONYM TO my_user;
GRANT CREATE ROLE TO my_user;
GRANT CREATE SEQUENCE TO my_user;
GRANT CREATE SYNONYM TO my_user;
GRANT CREATE TABLE TO my_user;
GRANT CREATE TRIGGER TO my_user;
GRANT CREATE TYPE TO my_user;
GRANT CREATE VIEW TO my_user;
GRANT SELECT_CATALOG_ROLE TO my_user;
GRANT SELECT ANY DICTIONARY TO my_user;
END;
/
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)CREATE USER my_user IDENTIFIED BY my_password DEFAULT TABLESPACE users; * ERROR en línea 5: ORA-06550: line 5, column 2: PLS-00103: Encountered the symbol "CREATE" when expecting one of the following: ( begin case declare exit for goto if loop mod null pragma raise return select update while with <an identifier> <a double-quoted delimited-identifier> <a bind variable> << continue close current delete fetch lock insert open rollback savepoint set sql execute commit forall merge pipe purge
是否禁止CREATE USER在PL/SQL块中使用语句或者我只是做了一个愚蠢的错字?是否必须使用SQL*Plus变量?
PLS-00103:遇到以下其中一项时遇到符号"CREATE":
上述错误是因为您在PL/SQL中使用DDL.你不能这样做.您必须(ab)使用EXECUTE IMMEDIATE在PL/SQL中发出DDL语句.
例如,
SQL> DECLARE
2 my_user VARCHAR2(30) := 'foo';
3 my_password VARCHAR2(9) := '1234';
4 BEGIN
5 EXECUTE IMMEDIATE 'CREATE USER '||my_user||' IDENTIFIED BY '||my_password;
6 EXECUTE IMMEDIATE 'GRANT CREATE SESSION TO '||my_user;
7 END;
8 /
PL/SQL procedure successfully completed.
SQL> conn foo/1234@pdborcl
Connected.
SQL> SHOW USER
USER is "FOO"
Run Code Online (Sandbox Code Playgroud)
文档快速参考,
在PL/SQL中执行DDL和SCL语句
只有动态SQL才能在PL/SQL程序单元中执行以下类型的语句:
数据定义语言(DDL)语句,例如
CREATE,DROP,GRANT,和REVOKE会话控制语言(SCL)语句如
ALTER SESSION和SET ROLE- 将
TABLE在该条款SELECT声明
在旁注,
创建用户和授予权限通常是DBA负责的数据库管理任务.它不是通过PL/SQL程序完成的频繁活动.DBA创建用户并将必要的权限授予一次性活动.