鉴于此类型:
-- Just for testing purposes:
CREATE TYPE testType as (name text)
Run Code Online (Sandbox Code Playgroud)
我可以使用此函数动态获取字段的值:
CREATE OR REPLACE FUNCTION get_field(object anyelement, field text) RETURNS text as
$BODY$
DECLARE
value text;
BEGIN
EXECUTE 'SELECT $1."' || field || '"'
USING object
INTO value;
return value;
END;
$BODY$
LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)
呼叫get_field('(david)'::testType, 'name')
按预期工作返回"大卫".
但是如何在复合类型中设置字段的值?我试过这些功能:
CREATE OR REPLACE FUNCTION set_field_try1(object anyelement, field text, value text)
RETURNS anyelement
as
$BODY$
DECLARE
value text;
BEGIN
EXECUTE '$1."' || field || '" := $2'
USING object, value; …
Run Code Online (Sandbox Code Playgroud) 我是PL/SQL的新手.我在这种语言中遇到循环问题.我想像这样循环:
FOR nr IN 1..102
LOOP
DBMS_OUTPUT.PUT_LINE(nr);
IF rec.column_||nr IS NULL
THEN
DBMS_OUTPUT.PUT_LINE('test');
END IF;
END LOOP;
Run Code Online (Sandbox Code Playgroud)
我创建了一个游标.如您所见,我想检查列号为column_1到column_102的所有列.不幸的是|| 运营商不适用于这种情况.你知道我的问题的一些解决方案吗?
问题:如何在存储函数中声明相同类型的变量参数?
简单的答案是使用%TYPE
,这有效:
CREATE OR REPLACE FUNCTION test_function_1(param1 text)
RETURNS integer AS
$BODY$
DECLARE
myVariable param1%TYPE;
BEGIN
return 1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
Run Code Online (Sandbox Code Playgroud)
但问题是何时param1
是复合类型:
CREATE TYPE comp_type as
(
field1 text
)
CREATE OR REPLACE FUNCTION test_function_2(param1 comp_type)
RETURNS integer AS
$BODY$
DECLARE
myVariable param1%TYPE;
BEGIN
return 1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
Run Code Online (Sandbox Code Playgroud)
这不起作用:
ERROR: type comp_type does not exist [SQL State=42704]
Run Code Online (Sandbox Code Playgroud)
那么当param1
复合型时我该怎么办?
(注意:myVariable comp_type
因为我的功能稍微复杂一点, …
给定缓冲区 ID,如何获取缓冲区的缓冲区类型?我知道我可以切换到该缓冲区并用于:set buftype?
获取类型。
但是我怎么能不跳到那个缓冲区呢?
(我希望有类似的buftype(id)
工作方式bufname(id)
)
plpgsql ×2
postgresql ×2
types ×2
composite ×1
database ×1
oracle ×1
plsql ×1
polymorphism ×1
sql ×1
vim ×1