ITPUB??ì3
12月微软Hyper-V虚拟化沙龙主题征集
ITPUB论坛 » Oracle开发 » 一个存储过程的问题

标题: 一个存储过程的问题
离线 LiuChao197731
中级会员



精华贴数 0
个人空间 0
技术积分 564 (3467)
社区积分 27 (6672)
注册日期 2001-12-28
论坛徽章:1
授权会员     
      

发表于 2002-1-23 17:29 
一个存储过程的问题

这个是执行动态SQL的存储过程,可是当执行以下的SQL语句的时候,却出现错误,错误信息为:ORA-00942:表或视图不存在。
insert into java.customers_4340000(customer_id,login_name,customer_type,name,sex,birth_date,
dist_code,address,postalcode,telephone,certificate_type,certificate_code,org_type,org_name,
description,customer_status,register_time,valid_date,message_address,fax,email,customer_point,
customer_level,vip_card_no,customer_like,custom_consume,credit_how,up_customer_id,fidelity_how,
certificate_address,send_type,password,linkman,linkman_telephone) values('000000000021',NULL,0,'newsky','',
NULL,'1','','2100000','','4','0000000000000021','','','','1',sysdate,to_date('yyyymmdd',''),'远大一路','',
'',0,0,NULL,'','',5,'','0','远大一路','3','222','于','5433092');
可是直接执行并没有错误,表和用户都是存在的。

储存过程如下:

CREATE OR REPLACE PROCEDURE LINE.execute_sql (sql_str IN VARCHAR2) AS
   cid INTEGER;
   v_rownum        number(10);
BEGIN
   /* Open new cursor and return cursor ID. */
   cid := DBMS_SQL.OPEN_CURSOR;
   /* Parse and immediately execute dynamic SQL statement built by
      concatenating table name to DROP TABLE command. */
   DBMS_SQL.PARSE(cid, sql_str, DBMS_SQL.V7);
       v_rownum:=DBMS_SQL.EXECUTE(cid);
   /* Close cursor. */
   DBMS_SQL.CLOSE_CURSOR(cid);
EXCEPTION
   /* If an exception is raised, close cursor before exiting. */
   WHEN OTHERS THEN
      DBMS_SQL.CLOSE_CURSOR(cid);
        RAISE;  -- reraise the exception
--        rollback;
END execute_sql;
/


只看该作者    顶部
在线/呼叫 biti_rainy
人生就是如此



精华贴数 38
个人空间 0
技术积分 111199 (4)
社区积分 11832 (132)
注册日期 2001-12-12
论坛徽章:41
现任管理团队成员ITPUB长老会成员ITPUB元老年度论坛发贴之星年度论坛发贴之星ITPUB北京九华山庄2008年会纪念徽章
管理团队2007贡献徽章参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章管理团队2006纪念徽章会员2007贡献徽章会员2006贡献徽章

发表于 2002-1-23 18:28 


java.customers_4340000

难道是动态sql中对于上面这个用户java不认?
不加用户名直接插呢?

顺便说一点,不过这个功能根本没有必要使用dbms_lob包


__________________
眼界决定边界,态度决定高度
blog:
人生就是如此
只看该作者    顶部
在线/呼叫 biti_rainy
人生就是如此



精华贴数 38
个人空间 0
技术积分 111199 (4)
社区积分 11832 (132)
注册日期 2001-12-12
论坛徽章:41
现任管理团队成员ITPUB长老会成员ITPUB元老年度论坛发贴之星年度论坛发贴之星ITPUB北京九华山庄2008年会纪念徽章
管理团队2007贡献徽章参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章管理团队2006纪念徽章会员2007贡献徽章会员2006贡献徽章

发表于 2002-1-23 19:08 
我测试了一下

SQL> exec execute_sql('delete from syspara');

PL/SQL procedure successfully completed

SQL> select * from syspara;

PARAMETERNAME        PARAMETERVALUE                          
-------------------- ----------------------------------------

SQL>
SQL> exec execute_sql('insert into syspara values(''3213'',''312'')');

PL/SQL procedure successfully completed

SQL> select * from syspara;

PARAMETERNAME        PARAMETERVALUE                          
-------------------- ----------------------------------------
3213                 312                                    

SQL>

上面完全是用你的代码执行的
但是创建的过程和过程中删除的表都是一个用户的

所以怀疑你的问题在用户上


__________________
眼界决定边界,态度决定高度
blog:
人生就是如此
只看该作者    顶部
离线 eric
中级会员


精华贴数 0
个人空间 0
技术积分 457 (4323)
社区积分 288 (1985)
注册日期 2001-10-17
论坛徽章:1
      
      

发表于 2002-1-23 19:44 
Try grant the insert privilege on table customers_4340000 to current user directly.


__________________
-----------------------------------------------------不是我不明白,这世界变化快。
只看该作者    顶部
离线 LiuChao197731
中级会员



精华贴数 0
个人空间 0
技术积分 564 (3467)
社区积分 27 (6672)
注册日期 2001-12-28
论坛徽章:1
授权会员     
      

发表于 2002-1-24 13:58 
权限没有问题。
biti_rainy,按你的SQL语句我想也不会有问题的,可是按我那条的确就是那样的错误。我不用这个存储过程,直接执行SQL也没有问题的。
eric,我已经授权给用户了。


只看该作者    顶部
离线 cactus
无药可救



精华贴数 0
个人空间 0
技术积分 758 (2540)
社区积分 1 (33175)
注册日期 2001-11-5
论坛徽章:1
授权会员     
      

发表于 2002-1-27 02:17 
我遇到过这个问题,好像是动态语句长度的问题,你的这条动态语句太长了,我后来怎么调整的忘记了,还是请其他大侠帮忙一下吧。


__________________
本人优点:多情!本人缺点:自作多情!E_mail:cactus@itpub.netOICQ :7389650
只看该作者    顶部
离线 graydolphin
中级会员



精华贴数 0
个人空间 0
技术积分 486 (4063)
社区积分 3 (19636)
注册日期 2001-9-24
论坛徽章:1
授权会员     
      

发表于 2002-1-27 15:11 
----From Metalink.oracle.com-----
Diagnose ora-00942
       This is because you have the required object privileges via a role - the
       *owner of the procedure* that calls the dbms_sql package needs object
       privileges granted *directly*. (The PL/SQL compiler cannot check this at
       compile-time if the table_name is supplied at run-time.)

       Note that calls to dbms_sql do *not* run as the owner of the package
       (SYS), but with the privileges of the calling user.


只看该作者    顶部
离线 daniel-yong
早起的虫子


精华贴数 0
个人空间 0
技术积分 2054 (794)
社区积分 3880 (368)
注册日期 2001-11-12
论坛徽章:3
ITPUB元老会员2006贡献徽章授权会员   
      

发表于 2002-1-27 15:25 
在procedure中选择其他用户下的表都需要专门赋予SELECT ANY TABLE权限,插入也一样。


__________________
回忆如陈酿,浅尝即止则回味无穷;如果贪杯,难免伤身。''偶的id''@itpub.net
只看该作者    顶部
 
    

相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问