我是 Postgres 的新手。以下是我的表 job_defn
的结构和一些示例数据:
CREATE TABLE job_defn (
job_id INTEGER NOT NULL,
job_name CHARACTER VARYING(255) NOT NULL,
system CHARACTER VARYING(50) NOT NULL,
frequency CHARACTER VARYING(10) NOT NULL,
run_day_id INTEGER NOT NULL,
run_day_of_month INTEGER NOT NULL,
eff_start_date DATE NOT NULL,
eff_end_date DATE NOT NULL
);
示例数据:
---------------------------
job_id frequency
---------------------------
1001 DAILY
1002 WEEKLY
---------------------------
运行以下函数时,我希望l_freq
变量包含表中的frequency
列值。然而,它总是打印 NULL,即使表行包含一个值:
CREATE OR REPLACE FUNCTION testing()
RETURNS void AS $$
DECLARE
l_job_id INTEGER;
l_job_defn_record job_defn%ROWTYPE;
l_freq CHARACTER VARYING(10);
BEGIN
FOR l_job_defn_record IN
SELECT job_id, frequency FROM job_defn ORDER BY job_id ASC
LOOP
l_job_id := l_job_defn_record.job_id;
l_freq := l_job_defn_record.frequency;
raise info'job id: %, frq: %', l_job_id, l_freq;
raise info'row==>%', l_job_defn_record;
END LOOP;
END;
$$ LANGUAGE plpgsql VOLATILE;
日志:
17:50:52 [CREATE - 0 row(s), 0.036 secs] Command processed. No rows were affected
Code: 0 SQL State: 00000 --- job id: 10001, frq: <NULL>
Code: 0 SQL State: 00000 --- row==>(10001,DAILY,,,,,,,,,,)
Code: 0 SQL State: 00000 --- job id: 10001, frq: <NULL>
Code: 0 SQL State: 00000 --- row==>(10001,DAILY,,,,,,,,,,)
Code: 0 SQL State: 00000 --- job id: 10001, frq: <NULL>
Code: 0 SQL State: 00000 --- row==>(10001,DAILY,,,,,,,,,,)
Code: 0 SQL State: 00000 --- job id: 10001, frq: <NULL>
Code: 0 SQL State: 00000 --- row==>(10001,DAILY,,,,,,,,,,)
Code: 0 SQL State: 00000 --- job id: 10001, frq: <NULL>
Code: 0 SQL State: 00000 --- row==>(10001,DAILY,,,,,,,,,,)
Code: 0 SQL State: 00000 --- job id: 10001, frq: <NULL>
Code: 0 SQL State: 00000 --- row==>(10001,DAILY,,,,,,,,,,)
Code: 0 SQL State: 00000 --- job id: 10001, frq: <NULL>
Code: 0 SQL State: 00000 --- row==>(10001,DAILY,,,,,,,,,,)
Code: 0 SQL State: 00000 --- job id: 10002, frq: <NULL>
Code: 0 SQL State: 00000 --- row==>(10002,WEEKLY,,,,,,,,,,)
... 1 statement(s) executed, 0 row(s) affected, exec/fetch time: 0.036/0.000 sec [0 successful, 1 warnings, 0 errors]
最佳答案
您声明了记录变量 l_job_defn_record
作为类型 job_defn%ROWTYPE
.正如您稍后澄清的那样,表格 job_defn
实际上不仅仅包含您首先披露的两个专栏。 FOR
中的作业循环只分配记录变量的前两个字段:
...
FOR l_job_defn_record IN
SELECT job_id, frequency FROM ... -- wrong!
...
这样,SELECT
的第 2 列查询 ( job_defn.frequency
) 被分配给记录变量 ( l_job_defn_record.job_name
) 的第二个字段 - 显然不是预期的。它恰好自 frequency
开始工作也是类型 varchar
.未分配记录的尾随字段,默认为 NULL
.
这会解决它:
...
FOR l_job_defn_record IN
SELECT <b>*</b> FROM job_defn ORDER BY job_id
...
经常,SELECT *
是可疑编码,但在这种情况下,这是自 l_job_defn_record
以来的正确方法与表 job_defn
具有相同的行类型根据定义。
关于postgresql - Postgres 在 FOR 循环中访问行值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51716232/