postgresql - Postgres 在 FOR 循环中访问行值

标签 postgresql loops rows variable-assignment plpgsql

我是 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/

相关文章:

java - 如何在JPA Spring Boot中的嵌套对象中通过Temporal.TIMESTAMP进行查询?

postgresql - 索引应该包含 'constant' 列吗?

java - 在 Java 中,在循环中调用字段访问器是否会在循环的每次迭代中创建新的引用?

javascript - 创建多维数组然后将每个多维数组推送到另一个数组

arrays - 从 MATLAB 工作区的列中选择特定行到数组中

mysql - 根据重复的列值过滤我们的行

sql - 是否可以访问 Postgres 中尚未清理的旧版本行?

sql - 如何制作完整的 CREATE TABLE 脚本

java - 从 for 循环打印元素

Jquery通过读取html内容拆分列