这是使用光标的另一种算法,但我很难修复它的错误...
CREATE OR REPLACE FUNCTION extractstudent()
RETURNS VOID AS
$BODY$
DECLARE
studcur SCROLL cursor FOR SELECT fname, lname, mname, address FROM student;
BEGIN
open studcur;
Loop
--fetching 1 row at a time
FETCH First FROM studcur;
--every row fetched is being inserted to another database on the local site
--myconT is the name of the connection to the other database in the local site
execute 'SELECT * from dblink_exec(''myconT'', ''insert into temp_student values(studcur)'')';
--move to the next row and execute …Run Code Online (Sandbox Code Playgroud) 我正在使用PostgreSQL 8.4,我想创建一个返回多行查询的函数.
下面的函数不能正常工作:
create function get_names(varchar) returns setof record AS $$
declare
tname alias for $1;
res setof record;
begin
select * into res from mytable where name = tname;
return res;
end;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
该类型record仅允许单行.
如何返回整个查询?我想使用函数作为查询模板.
我正在尝试在PostgreSQL上填充多维数组,但它不起作用.在我的代码下面:
CREATE OR REPLACE FUNCTION teste()
RETURNS void AS
$BODY$
DECLARE
tarifas NUMERIC[7][24];
a INTEGER;
b INTEGER;
BEGIN
FOR a IN 0..6 LOOP
RAISE NOTICE 'TESTE TESTE %', a;
FOR b IN 0..23 LOOP
RAISE NOTICE 'tarifas[%][%] = 0;', a, b;
tarifas[a][b] = 0;
END LOOP;
END LOOP;
END
$BODY$
LANGUAGE plpgsql VOLATILE;
Run Code Online (Sandbox Code Playgroud) 我试图将默认值设置为参数列表中的函数内的变量,但收到错误:
Run Code Online (Sandbox Code Playgroud)Create or replace function test(name varchar default null , city varchar default null , phonenumber varchar(20) default null , out sno bigint, address varchar) returns void as $$ Declare phonenumber AS VarChar(20); Begin phonenumber : =phonenumber; SELECT sno = MAX(ssno)+1 FROM emp; IF(sno IS NULL) then sno=IDENT_CURRENT('emp')+1; end; raise info '%',name; raise info '%',city; raise info '%',phonenumber; raise info '%',address; insert into emp(ename,ecity,ephonenumber,eaddress) values(name,city,phonenumber,address); end; $$ langauge plpgsql;
Create or replace function test(name varchar default null
, city …Run Code Online (Sandbox Code Playgroud) 我尝试ALTER使用新用户的函数,我得到错误:
ERROR: must be owner of function ACases
********** Error **********
ERROR: must be owner of function ACases
SQL state: 42501
Run Code Online (Sandbox Code Playgroud)
我必须给予用户什么权限才能实现ALTER这一功能?我发现的唯一方法是让用户成为OWNER该功能的用户.
但如果是这种情况,只有一个用户(所有者)可以使用ALTER该功能.那么如何更改OWNER所有功能呢?
CREATE OR REPLACE FUNCTION public."ACases"(caseid integer)
RETURNS boolean AS
$BODY$
DECLARE
BEGIN
RETURN FALSE;
END;
$BODY$
LANGUAGE plpgsql;
ALTER FUNCTION public."ACases"(integer) OWNER TO postgres;
GRANT ALL PRIVILEGES ON FUNCTION public."ACases"(integer) TO user_name;
Run Code Online (Sandbox Code Playgroud) 我没有太多运气就寻找了这个...希望您能帮助我...
这是我的PL / pgSQL函数:
CREATE OR REPLACE FUNCTION crearempresa(
_id_empresa integer DEFAULT NULL::integer,
_ci_rif character varying DEFAULT NULL::character varying,
_nombre character varying DEFAULT NULL::character varying,
_persona_contacto character varying DEFAULT NULL::character varying,
_telefono_movil character varying DEFAULT NULL::character varying,
_telefono_oficina character varying DEFAULT NULL::character varying,
_fax character varying DEFAULT NULL::character varying,
_email character varying DEFAULT NULL::character varying,
_email_alterno character varying DEFAULT NULL::character varying,
_direccion character varying DEFAULT NULL::character varying,
_tipoempresa character varying DEFAULT NULL::character varying,
_cod_usuario integer DEFAULT NULL::integer,
_estado_registro integer DEFAULT …Run Code Online (Sandbox Code Playgroud) 我创建了一个带有CITEXT列的表格CITEXT(的大小写不敏感TEXT),这是我之前使用加载的扩展CREATE EXTENSION citext;
CREATE TABLE artists (
artist_id SERIAL PRIMARY KEY,
artist CITEXT UNIQUE NOT NULL
);
CREATE OR REPLACE FUNCTION add_artist(_artist CITEXT) RETURNS INTEGER AS $$
DECLARE
_artist_id INT;
BEGIN
SELECT artist_id INTO _artist_id FROM artists WHERE artist = _artist;
IF (_artist_id IS NULL) THEN
INSERT INTO artists (artist) VALUES (
_artist
) RETURNING artist_id INTO _artist_id;
END IF;
RETURN _artist_id;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试使用以下方法在Java中调用该函数
public int addArtist(String name) throws SQLException …Run Code Online (Sandbox Code Playgroud) 我正在尝试将我的一个oracle数据库迁移到Postgres 9.5.我目前正在尝试创建下一个功能:
-- Generated by Ora2Pg, the Oracle database Schema converter, version 18.1
-- Copyright 2000-2017 Gilles DAROLD. All rights reserved.
-- DATASOURCE: dbi:Oracle:oralab
SET client_encoding TO 'UTF8';
SET search_path = repdev,public,oracle,utl_file,extensions;
show search_path;
CREATE OR REPLACE FUNCTION Bl_Create_Flat_File_Pg.set_charset (file_id
utl_file.file_type, p_title text DEFAULT NULL) RETURNS VOID AS $body$
BEGIN
.....
End;
--
$body$
LANGUAGE PLPGSQL
SECURITY DEFINER
STABLE;
ALTER FUNCTION Bl_Create_Flat_File_Pg.set_charset (file_id
utl_file.file_type, p_title text DEFAULT NOT NULL ) OWNER TO repdev;
Run Code Online (Sandbox Code Playgroud)
但是当我在psql中运行它时,我发出下一个错误:
Run Code Online (Sandbox Code Playgroud)ERROR: syntax error at or near …
代码:
CREATE FUNCTION square_num(num integer)
RETURNS INTEGER AS $$
BEGIN
IF (num<0) THEN
RETURN 0;
END IF;
RETURN num*num;
END; $$
LANGUAGE PLPGSQL;
Run Code Online (Sandbox Code Playgroud)
上面的代码在数据库postgres和模式中创建了一个函数public.如何在特定数据库及其架构中创建函数?谢谢.
我想创建一个对行进行计数并更新另一个表中的字段的触发器。我当前的解决方案适用于INSERT语句,但是当我删除一行时失败。
我当前的功能:
CREATE OR REPLACE FUNCTION update_table_count()
RETURNS trigger AS
$$
DECLARE updatecount INT;
BEGIN
Select count(*) into updatecount
From source_table
Where id = new.id;
Update dest_table set count=updatecount
Where id = new.id;
RETURN NEW;
END;
$$
LANGUAGE 'plpgsql';
Run Code Online (Sandbox Code Playgroud)
触发器是一个非常基本的触发器,看起来像。
CREATE TRIGGER count_trigger
AFTER INSERT OR DELETE
ON source_table
FOR EACH ROW
EXECUTE PROCEDURE update_table_count();
Run Code Online (Sandbox Code Playgroud)
当我执行DELETE语句时,会发生以下错误:
错误:记录“新”尚未分配
详细信息:尚未分配的记录的元组结构是不确定的。
我知道一个解决方案可能是只为DELETE创建一组触发器和函数,为INSERT语句创建一组触发器和函数。但是我想做得更优雅一些,并且想知道,是否有一种解决方案可以检查当前上下文中是否存在NEW或OLD并仅实现IF ELSE块。但我不知道如何检查此上下文相关项。
谢谢你的帮助
plpgsql ×10
postgresql ×10
function ×2
sql ×2
arrays ×1
database ×1
java ×1
jdbc ×1
privileges ×1