在PL / pgSQL块中运行SELECT

时间:2015-07-07 06:10:01

标签: postgresql plpgsql

我是PostgreSQL的新手,我必须在SSRS报告中使用内联查询来从PostgreSQL DB中获取数据。

场景是:根据报表参数的选定值,我需要从不同的表中获取输出。请参阅以下示例内联查询。

    DO
    $do$

    BEGIN
    IF ($1 = 'Monthly') THEN

    SELECT *
    FROM table1;

    ELSE 

    SELECT *
    FROM table2;

    END IF;

    END
    $do$

以上查询给出了错误

  

错误:查询没有结果数据的目的地   SQL状态:42601   提示:如果要丢弃SELECT的结果,请改用PERFORM。   上下文:PL / pgSQL函数inline_code_block第6行SQL语句

请注意,我无法使用存储过程或函数来检索所需数据,我只能使用内联查询。

有人可以告诉我如何解决上述错误吗?

3 个答案:

答案 0 :(得分:7)

您的示例有两个问题 - DO语句(匿名阻止)不支持

  1. 参数
  2. 返回结果。
  3. PostgreSQL不支持T-SQL或MS-SQL中使用的称为未绑定查询的技术。每个查询都必须具有指定的目标。您可以改为使用函数(table1table2应具有相同的结构):

    CREATE OR REPLACE FUNCTION foo(frequency)
    RETURNS SETOF table1 AS $$
    BEGIN
      IF $1 = 'Monthly' THEN
        RETURN QUERY SELECT * FROM table1;
      ELSE
        RETURN QUERY SELECT * FROM table2;
      END IF;
      RETURN;
    END;
    $$ LANGUAGE plpgsql;
    
    SELECT * FROM foo('Monthly');
    

答案 1 :(得分:2)

假设表具有相同的列结构,您可以使用union在单个查询中执行这两个选项。

<Window x:Class="MyWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <WindowsFormsHost Name="f_WindowsFormsHost"/>
</Window>

答案 2 :(得分:0)

您可以创建一个临时表来获取结果,但不能传递参数:

DO
$$
BEGIN
IF <> THEN
CREATE TEMPORARY TABLE foo AS
SELECT *FROM ...
 ELSE

 ....
 END IF;
 END
 $$
 SELECT * FROM FOO;