ORACLE的存储过程执行报错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORACLE的存储过程执行报错相关的知识,希望对你有一定的参考价值。

ORACLE的数据库,

存储过程的创建语句如下
create /*or replace */procedure cgl_3g_pd as
begin
drop table cgl_3g;
create table cgl_3g as
select a.serial_number 号码,
(select h.product_name from crm_ucr_cen1.td_b_product@dblnk_ngbss h where a.product_id=h.product_id)product,
to_char(a.in_date,'yyyymmdd') in_date,
a.develop_staff_id 发展人编号,
(select b.staff_name from crm_ucr_cen1.td_m_staff@dblnk_ngbss b where a.develop_staff_id=b.staff_id)develop_staff,
a.develop_depart_id 发展部门编号,
(select c.depart_name from crm_ucr_cen1.td_m_depart@dblnk_ngbss c where a.develop_depart_id=c.depart_id)develop_depart,
(select d.depart_name from crm_ucr_cen1.td_m_depart@dblnk_ngbss d where a.open_depart_id=d.depart_id)open_depart
from crm_ucr_crm1.tf_f_user@dblnk_ngbss a
where (a.serial_number like '186%'or a.serial_number like '145%')
and a.remove_tag='0'
and to_char(a.in_date,'yyyymmdd')>='20091001'
order by a.in_date;
commit;
end;

创建时可以通过,执行时会报错,在PL/SQL下执行exec CGL_3G_PD 报‘ORA-00900:无效的SQL语句’
用GOLDEN下执行exec CGL_3G_PD 报:
ORA-06550: 第 1 行, 第 18 列:
PLS-00905: 对象 ZHDSS.CGL_3G_PD 无效
ORA-06550: 第 1 行, 第 18 列:
PL/SQL: Statement ignored

到底是什么原因,求解答

DROP ,CREATE 等DDL语句要动态执行
execute immediate 'drop table cgl_3g';
execute immediate 'create ....';
还有
(select h.product_name from crm_ucr_cen1.td_b_product@dblnk_ngbss h where a.product_id=h.product_id)product,
你要保证像这样的子查询都是返回1行的
参考技术A ZHDSS.CGL_3G_PD?哪里来的?程序中没出现过啊
你试试 select CGL_3G_PD from dual 看看

oracle存储过程中执行查询sql语句报错

Create Or Replace Procedure UP_ExecSqlProcForDS(strSql In Varchar2,cur_out Out sys_refcursor)
As
Begin
Open cur_out For
Execute immediate strSql;
End;
strSql是一条查询sql语句,类似于select * from table,我想要的是给存储过程传一个查询的sql语句,然后存储过程给我返回结果集,怎么弄?

参考技术A 你这种可以用函数来实现
CREATE OR REPLACE FUNCTION UP_ExecSqlProcForDS RETURN NUMBER IS

CURSOR tmcur_out IS
select *from table
;
begin
FOR l_cur IN tmcur_out LOOP
end loop
exception
end
这个只是框架,你自己可以 根据自己的需要作适当修改
参考技术B Open cur_out For strsql;
这个是么?
这是定义游标的使用方法,游标的语法是一个SELECT语句的字符串

type cursor_type is ref cursor;
c1 cursor_type;

open c1 for selectsql;
参考技术C CREATE OR REPLACE Procedure UP_ExecSqlProcForDS(strSql In Varchar2,cur_out Out sys_refcursor)
As
Begin
Open cur_out For
strSql;
End;本回答被提问者采纳
参考技术D 我空间有个关于存储过程的,看看能不能帮到你。

以上是关于ORACLE的存储过程执行报错的主要内容,如果未能解决你的问题,请参考以下文章

oracle 执行有返回值的存储过程报错

ORACLE 存储过程报错 PLS-00103 求查错

oracle 存储过程报错

执行 C#的服务器端程序调用Oracle的存储过程报错

oracle 存储过程调用

oracle 存储过程 执行、调用不成功 求高手指导?