- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个包使用了 Oracle 的两个独特特性,REF_CURSOR 和一个包全局变量。我想将功能从 Oracle 移植到 Postgresql 或 MySQL。
PACKAGE tox IS
/*=======================*/
g_spool_key spool.key%TYPE := NULL;
TYPE t_spool IS REF CURSOR RETURN spool%ROWTYPE;
/*=======================*/
PROCEDURE begin_spool;
/*=======================*/
PROCEDURE into_spool
(
in_txt IN spool.txt%TYPE
);
/*=======================*/
PROCEDURE reset_spool;
/*=======================*/
FUNCTION end_spool
RETURN t_spool;
/*=======================*/
FUNCTION timestamp
RETURN VARCHAR2;
/*=======================*/
END tox;
PACKAGE BODY tox
IS
/*========================================================================*/
PROCEDURE begin_spool
AS
/*=======================*/
BEGIN
/*=======================*/
SELECT
key.NEXTVAL
INTO
g_spool_key
FROM
DUAL;
/*=======================*/
END begin_spool;
/*========================================================================*/
PROCEDURE into_spool
(
in_txt IN spool.txt%TYPE
)
AS
/*=======================*/
BEGIN
/*=======================*/
INSERT INTO
spool
VALUES
(
g_spool_key,
in_txt,
seq.NEXTVAL
);
/*=======================*/
END into_spool;
/*========================================================================*/
PROCEDURE reset_spool
AS
/*=======================*/
BEGIN
/*=======================*/
DELETE
spool
WHERE
key = g_spool_key;
COMMIT;
begin_spool;
/*=======================*/
END reset_spool;
/*========================================================================*/
FUNCTION end_spool
RETURN t_spool
AS
v_spool t_spool;
/*=======================*/
BEGIN
/*=======================*/
COMMIT;
OPEN v_spool FOR
SELECT
*
FROM
spool
WHERE
key = g_spool_key
ORDER BY
seq;
RETURN v_spool;
/*=======================*/
END end_spool;
/*========================================================================*/
FUNCTION timestamp
RETURN VARCHAR2
AS
/*-----------------------*/
v_result VARCHAR2(14);
/*=======================*/
BEGIN
/*=======================*/
SELECT
TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS')
INTO
v_result
FROM
DUAL;
RETURN v_result;
/*=======================*/
END timestamp;
/*========================================================================*/
END tox;
您能生成等效的代码吗?对于 PostgreSQL?用于 MySQL?
注意:Oracle 代码是线程安全的。这是一项关键功能。
最佳答案
PostgreSQL 8.3
PostgreSQL 中的问题是缺少全局(或包)变量,所以这部分必须通过首先创建的临时表来解决。剩下的就很简单了。
如果您真的想将应用程序移植到 PostgreSQL 或 MySQL,我建议您根本不要使用全局变量,因为它们在编码时是不好的做法(至少在我看来 :))
但是无论如何,这是代码:
这必须在运行函数之前存在:
create table spool (key integer, txt varchar(2048), seq integer);
create sequence s_key;
create sequence s_seq;
create schema tox;
create temp table globals (name varchar(10), value varchar(100), primary key(name));
这些函数被放入模式 tox 中以模拟一个包。
create or replace function tox.get_variable(var_name varchar) returns varchar as $$
declare
ret_val varchar(100);
begin
select value into ret_val from globals where name = var_name;
return ret_val;
end
$$ language plpgsql;
create or replace function tox.set_variable(var_name varchar, value anyelement) returns void as $$
begin
delete from globals where name = var_name;
insert into globals values(var_name, value);
end;
$$ language plpgsql;
create or replace function tox.begin_spool() returns integer as $$
begin
perform tox.set_variable('key', nextval('s_key')::varchar);
return tox.get_variable('key');
end;
$$ language plpgsql;
create or replace function tox.reset_spool() returns integer as $$
begin
delete from spool where key = tox.get_variable('key')::integer;
return tox.begin_spool();
end;
$$ language plpgsql;
create or replace function tox.into_spool(in_txt spool.txt%TYPE) returns void as $$
begin
insert into spool values(tox.get_variable('key')::integer, in_txt, nextval('s_seq'));
end;
$$ language plpgsql;
create or replace function tox.end_spool(refcursor) returns refcursor as $$
declare
begin
open $1 for select * from spool where key = tox.get_variable('key')::integer order by seq;
return $1;
end;
$$ language plpgsql;
create or replace function tox.test(txt varchar(100)) returns setof spool as $$
declare
v_spool_key integer;
cnt integer;
begin
v_spool_key = tox.begin_spool();
for cnt in 1..10 loop
perform tox.into_spool(txt || cnt);
end loop;
perform tox.end_spool('spool_cursor');
return query fetch all from spool_cursor;
end;
$$ language plpgsql;
要进行测试,只需在创建所有内容后运行即可。
select * from tox.test('Test');
关于mysql - 使用 REF_CURSOR 转换 Oracle 存储过程并将全局变量封装到 Postgresql 或 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/489441/
我尝试调用存储过程 create or replace PROCEDURE "PROC"(cur OUT SYS_REFCURSOR) 用这个 bean 。 @Bean StoredProce
我正在研究 Oracle 存储过程,我有过程和 1 个参数 in - > x IN VARCHAR2, out -> REF_CURSOR in out SYS_REFCURSOR. 我尝试使用 hi
你好,我工作Oracle存储过程,我有过程名称Test和2个参数 -> x IN VARCHAR2,out -> REF_CURSOR in out SYS_REFCURSOR 。我试图使用 hibe
我不知道如何在 PostgresSQL 中使用游标作为存储过程的输出参数。我一直在关注这个 https://gist.github.com/thomasdarimont/129bc15d0ccc459
我正在尝试使用 vertx3 读取返回 ref_cursor 的 Oracle 存储过程。如果我编辑它以返回 clob 并使用 JDBCType.CLOB,则相同的过程有效,但由于某种原因我必须使用
这个包使用了 Oracle 的两个独特特性,REF_CURSOR 和一个包全局变量。我想将功能从 Oracle 移植到 Postgresql 或 MySQL。 PACKAGE tox IS /
我在我的 PostgreSQL 数据库中创建了一个函数,我想使用 JPA 2.1 的 StoredProcedureQuery 方法调用它。 这是我的 PostgreSQL 查询: CREATE OR
在我的项目中使用 PostgreSQL JDBC 驱动程序时,我收到一个奇怪的错误,指出“试图衡量 JDBC REF_CURSOR 支持级别的意外错误:空” 它会导致我的应用程序在启动时挂起 80 到
我是一名优秀的程序员,十分优秀!