oracle中创建一个存储过程(procedure),过程中包含一句最简答的sql,C# 使用sql语句。。。 50

C#中使用sql语句,调用oracle的存储过程,直接返回一个datatable,就像是普通的select一样。这只是一个测试,sql语句很简单:SELECTSHOW_N... C# 中使用sql语句,调用oracle的存储过程,直接返回一个datatable,就像是普通的select一样。
这只是一个测试,sql语句很简单:
SELECT SHOW_NAME FROM DOCS_REPORT_ITEM_CONFIG WHERE ITEM_ID=1129
sqlserver中很简单就实现了,oracle第一次用,网上有很多方法都不行。不需要任何参数,普通的返回一个datatabe就行了
高分献上!
展开
 我来答
Andy_Sun321
2014-07-21 · TA获得超过1376个赞
知道小有建树答主
回答量:811
采纳率:89%
帮助的人:747万
展开全部
也是先学习 SQL Server , 再开始学习Oracle的, 也为此找了很多资料. 你所说的这个需求可以这样实现, 给你我的一个例子:
/* 定义Package 头*/
CREATE OR REPLACE PACKAGE APPS.ECS_SIPRMA_PKG_SYS
IS
TYPE TYPE_INTLIST_ITEM IS RECORD (IDX NUMBER, VAL NUMBER);
FUNCTION SPLIT2INT (SRC VARCHAR2, CH VARCHAR2) RETURN ECS_SIPRMA_PKG_SYS.TYPE_INTLISTTB PIPELINED;
...

/* package中函数 SPLIT2INT*/
FUNCTION SPLIT2INT (SRC VARCHAR2, CH VARCHAR2)
RETURN ECS_SIPRMA_PKG_SYS.TYPE_INTLISTTB PIPELINED
IS
N1 NUMBER;
N2 NUMBER := LENGTH(CH);
S1 VARCHAR2(4000);
S2 VARCHAR2(4000) := SRC;
I NUMBER := 0;
E ECS_SIPRMA_PKG_SYS.TYPE_INTLIST_ITEM;
BEGIN
IF SRC IS NULL OR CH IS NULL THEN
RETURN;
END IF;

LOOP
N1 := INSTR(S2, CH);
IF N1 = 0 THEN
S1 := TRIM(S2);
IF S2 IS NOT NULL THEN
I := I + 1;
E.VAL := TO_NUMBER(S1, '999999999999');
E.IDX := I;
PIPE ROW(E);
END IF;
ELSIF N1 >= 1 THEN
S1 := TRIM(SUBSTR(S2, 1, N1 - 1));
IF S1 IS NOT NULL THEN
I := I + 1;
E.VAL := TO_NUMBER(S1, '999999999999');
E.IDX := I;
PIPE ROW(E);
END IF;
S2 := SUBSTR(S2, N1 + N2, LENGTH(S2) - N1 - N2 + 1);
END IF;
EXIT WHEN N1 = 0 OR S2 IS NULL;
END LOOP;
RETURN;
END SPLIT2INT;

而查询时, 则使用table函数将返回结果转成结果集:
select * from table(APPS.ECS_SIPRMA_PKG_SYS.SPLIT2INT('1;2;3', ';'));

需要用到的知识: 索引表, pipe row方法, table函数.

一个完整例子:
/* 创建包头 */
create or replace package pkg_test
is
type type_rtn_item is record (s_name varchar2(200));
type type_rtn_tb is table of pkg_test.type_rtn_item;
function rtn_table return pkg_test.type_rtn_tb pipelined;
end pkg_test;

/* 创建包体 */
create or replace package body pkg_test
is
function rtn_table
return pkg_test.type_rtn_tb pipelined
is
ele pkg_test.type_rtn_item;
begin
for si in (SELECT SHOW_NAME FROM DOCS_REPORT_ITEM_CONFIG WHERE ITEM_ID=1129) loop
ele.s_name := si.SHOW_NAME;
pipe row(ele);
end loop;

return;
end rtn_table;
end pkg_test;

/* 查询语句 */
select * from table(pkg_test.rtn_table());

注意: 该package需要在10g以上版本运行, 因为pipelined功能好像从10g才开始有的.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式