最近在看书,看到动态sql这章,做了个练习,但怎么执行都不过了,请大哥哥们回复
如下:
create or replace procedure dynamicsql as
t_sql varchar2(200);
t_classno varchar(10);
t_stuid varchar(10);
t_infos infos%rowtype;
t_user  varchar(20);
t_password varchar(20);cursor cur_infos is select * from infos;
begin
for t_infos in cur_infos loop
t_stuid:=t_infos.stuid;
t_classno:=t_infos.classno;
t_sql:='create user :1 identified by :2 account unlock';
t_user:=CONCAT(t_stuid,t_classno);
t_password:=CONCAT(t_stuid,t_classno);
dbms_output.put_line(t_user);
  execute immediate t_sql using t_user,t_password; t_sql:='grant :1 to :2';
execute immediate t_sql using 'connect',t_user;
execute immediate t_sql using 'resource',t_user; end loop;end;动态sql 建用户

解决方案 »

  1.   

    执行时execute immediate t_sql using t_user,t_password; 这句报错,ora-01935:缺失的用户或角色名,但dbms_output都是有输出的,也就是说参数是有值的,刚学不太明白
      

  2.   

    有权限 已经付了权限
    t_sql:='create user :1 identified by :2 account unlock';如果改成t_sql:='create user test identified by test account unlock';
    s可以成功,但用参数就不行,很奇怪
    用户名和密码打印出来是这样的s1001021001
      

  3.   

    知道原因了
    create user xx identified by xx
    这样的语句中不能使用using参数
    改为如下问题解决
        t_stuid:=t_infos.stuid;
        t_classno:=t_infos.classno;    t_user:=CONCAT(t_stuid,t_classno);
        t_password:=CONCAT(t_stuid,t_classno);    t_sql:='create user '||t_user||' identified by '||t_user||' account unlock';
        dbms_output.put_line(t_user);
        execute immediate t_sql;-- using 's100102','1001';
        t_sql:='grant connect to '||t_user;--||t_user;
        execute immediate t_sql;    t_sql:='grant resource to '||t_user;--||t_user;
        execute immediate t_sql;