【发布时间】:2014-07-08 21:17:38
【问题描述】:
我在 plpgsql 方面不是很有经验,所以我在这里有 2 个问题。
- 在 Postgres 中是否可以像在动态 sql's for plsql 中那样使用游标?基本上我不想在 plsql 中使用过程,所以我创建了一个游标,它将保存我的动态查询的输出,然后我在另一个查询中的循环中使用该值以使我的输出显示在屏幕上。我正在尝试使用 Postgres 做同样的事情,但无法做到。
- 在这种情况下是否可以避免创建永久函数来完成此任务?
这是我运行良好的 oracle 脚本:
DECLARE
CURSOR cur_tables IS
SELECT NAME,
'SELECT PROPERTY_VALUE FROM '
|| USERNAME
|| '.P_PROPERTY WHERE PROPERTY_NAME = ''VERSION'''
AS dsql
FROM CB_DATASOURCE
WHERE (UPPER(USERNAME) LIKE 'NAV_PS_%' or UPPER(USERNAME) LIKE 'CBPS_%' or UPPER(USERNAME) LIKE 'DEFAULTPS');
CURR_VERSION VARCHAR2(1000);
BEGIN
FOR r_tables IN cur_tables LOOP
begin
EXECUTE IMMEDIATE r_tables.dsql INTO CURR_VERSION;
DBMS_OUTPUT.put_line(r_tables.NAME || ': ' || CURR_VERSION);
exception
when others then
DBMS_OUTPUT.put_line(r_tables.NAME || ' no table');
end;
END LOOP;
END;
/
这是我的 postgres 函数,我无法让它工作,但最终想避免使用永久函数
create or replace function upgrade_version() returns setof record as $$
declare
r record;
loopy record;
isql text;
CURR_VERSION text;
begin
for r in SELECT 'SELECT PROPERTY_VALUE FROM '
|| USERNAME
|| '.P_PROPERTY WHERE PROPERTY_NAME = ''VERSION'''
AS dsql
FROM CB_DATASOURCE
WHERE (UPPER(USERNAME) LIKE 'NAV_PS_%' or UPPER(USERNAME) LIKE 'CBPS_%' or UPPER(USERNAME) LIKE 'DEFAULTPS') loop
isql := r.dsql;
EXECUTE isql INTO CURR_VERSION;
RETURN next loopy;
end loop;
return;
end;
$$ language 'plpgsql';
我非常感谢您对此的任何意见。
【问题讨论】:
-
程序语言的名称是
PL/pgSQLor simplyplpgsql。 RDBMS 的名称是PostgreSQLorPostgresfor short。至少你可以自己发现。请提出一个中规中矩的问题,不要害怕formatting aids。 -
感谢您的意见。下次我会尝试提出一个体面的问题。
-
旁白:不要引用
LANGUAGE plpgsql中的语言名称。它是一个标识符,而不是一个字符串。目前可以容忍,但可能会在未来的版本中消失。
标签: function postgresql cursor plpgsql dynamic-sql