标签: dynamic-sql

从表中选择一组动态列并获取每个列的总和

是否可以在 Postgres 中执行以下操作:

SELECT column_name FROM information_schema WHERE table_name = 'somereport' AND data_type = 'integer';

SELECT SUM(coulmn_name[0]),SUM(coulmn_name[1]) ,SUM(coulmn_name[3]) FROM somereport;
Run Code Online (Sandbox Code Playgroud)

换句话说,我需要根据特定条件从表中选择一组列,然后对表中的每一列求和。

我知道我可以在循环中执行此操作,因此我可以独立计算每个列,但显然这需要对从信息模式查询返回的每个列进行查询。例如:

FOR r IN select column_name from information_schema where report_view_name = 'somereport' and data_type = 'integer';
LOOP
    SELECT SUM(r.column_name) FROM somereport;
END
Run Code Online (Sandbox Code Playgroud)

sql postgresql dynamic-sql plpgsql aggregate-functions

3
推荐指数
1
解决办法
3625
查看次数

PL/pgSQL:更新触发器中 N 列的一般方法?

我正在尝试创建一个函数,该函数将采用通用表并将 N 列转换为大写。我没有找到此类问题的解决方案,但我能够提出以下建议:

create or replace function uc_on_insert()
returns trigger as
$$
declare
p_tbl varchar = TG_TABLE_NAME;
p_sch varchar = TG_TABLE_SCHEMA;
i varchar;
begin
    for i in 

    (select column_name
    from  INFORMATION_SCHEMA.COLUMNS
    where 1=1
    and table_name ilike p_tbl
    and table_schema ilike p_sch
    and data_type ='character varying')

    loop
           execute 'new.' || i || ' = upper(new.' || i || ');';
       return new;
    end loop;

end;
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)

我目前收到此错误:

ERROR:  syntax error at or near "new"
LINE 1: new.c1 = upper(new.c1);
        ^ …
Run Code Online (Sandbox Code Playgroud)

postgresql triggers types dynamic-sql plpgsql

3
推荐指数
1
解决办法
1807
查看次数

Oracle创建函数

我尝试创建一个 Oracle 函数,其中表名、列名和字符串是动态参数:

CREATE OR REPLACE FUNCTION MYSCHEMA.myFunctionName( 
  tableName in nvarchar2,
  columnName in nvarchar2,
  whereStr in nvarchar2)
RETURN nvarchar2

IS nActive nvarchar2(2000);

BEGIN
  declare 
  querystr nvarchar2(2000) ;
  result nvarchar2(2000);
  begin
    querystr :='
    select  listagg('+columnName+','+','+') within group (order by '+columnName+')
    from '+tableName+' where  1 = 1 '+whereStr+';';
    EXECUTE IMMEDIATE querystr
    INTO result;
       nActive := result;
          RETURN ( nActive );
  end;
END ;
/
Run Code Online (Sandbox Code Playgroud)

但它给了我错误“警告:已编译但有编译错误”。

我究竟做错了什么?

oracle plsql dynamic-sql

3
推荐指数
1
解决办法
3577
查看次数

在 Postgres 10 中自动创建分区

我正在尝试按范围(创建日期)在一个巨大的表中自动执行 Postgres 10 中的分区。

我注意到没有自动创建分区表,因此我想编写一个过程来自动创建这些表。

我在想这样的事情:

CREATE OR REPLACE FUNCTION cdi.automating_partitions()
RETURNS TABLE(natural_id text, name text, natural_id_numeric text) AS
$func$
DECLARE
   formal_table text;
BEGIN
   FOR formal_table IN
       select '2017-01-01'::date + (n || ' months')::interval months,
       '2013-02-01'::date + (n || ' months')::interval monthsplus
       from generate_series(0, 12) n
   LOOP
      RETURN QUERY EXECUTE
   'CREATE TABLE cdi.' || 'document' || to_char(months, 'YYYY')  || ''  || to_char(months, 'MM') || ' PARTITION OF cdi.document
 FOR VALUES FROM  (''' ||  to_char(months, 'YYYY')  || to_char(months, 'MM')  || ''', …
Run Code Online (Sandbox Code Playgroud)

postgresql partitioning date dynamic-sql plpgsql

3
推荐指数
1
解决办法
2633
查看次数

使用Print()打印超过8000个字符

如何打印包含超过 8000 个字符的字符串(例如动态查询)?

Declare @sql varchar(max)
set @Qry='....(more than 8000 char)'
Print (@Qry)
Run Code Online (Sandbox Code Playgroud)

上面仅打印@Qry的前8000个字符并截掉其余部分。

t-sql dynamic-sql

3
推荐指数
1
解决办法
6018
查看次数

Z-ORA-01745: 无效的主机/绑定变量名称 (PLSQL)

我对 plsql 中的动态变量有点陌生。我在 EXECUTE IMMEDIATE 语句上收到错误“无效的主机/绑定变量名称”。提前致谢。

CREATE OR REPLACE PROCEDURE MY_CLASS_CONFIG_DML (pBuCode     VARCHAR2,
                                                 pMyPKId     VARCHAR2,
                                                 pMyName     VARCHAR2,
                                                 pMyId       VARCHAR2,
                                                 pRemarks    VARCHAR2,
                                                 pUserId     VARCHAR2)
AS
    v_table      VARCHAR2 (50);
    v_lastdate   DATE;
    --bindable var.
    v_pkey       VARCHAR2 (12) := pMyPKId;
    v_myname     VARCHAR2 (30) := pMyName;
    v_bucode     VARCHAR2 (4) := pBuCode;
    v_myid       VARCHAR2 (12) := pMyId;
    v_remarks    VARCHAR2 (50) := pRemarks;
    v_lastid     VARCHAR2 (8) := pUserId;
BEGIN
    v_lastdate := SYSDATE;
    v_table := v_bucode || '_WORKSHEET_CONFIG';

    --Error happens on this part
    EXECUTE IMMEDIATE
           'insert into ' …
Run Code Online (Sandbox Code Playgroud)

plsql dynamic-sql

3
推荐指数
1
解决办法
3895
查看次数

将列名作为参数传递给 mySQL 中的存储过程

我正在创建一些存储过程来管理我的数据库。特别是,我想创建一个存储过程来编辑特定行的列,但我想动态地执行此操作,将列名作为参数传递。

这就是我想做的

CREATE PROCEDURE myDB.edit_myTable(
    IN key CHAR(16), 
    IN col VARCHAR(100), 
    new_value VARCHAR(200)
)
UPDATE myDB.myTable SET col = new_value
Run Code Online (Sandbox Code Playgroud)

使用该参数,我找到要编辑的key特定行,并且我想使用该参数仅编辑我想要的列。myTablecol

正如我在其他主题上读到的那样,我已经尝试使用CONCATE()或定义局部变量,但我还没有找到解决方案。

有什么帮助吗?

mysql sql stored-procedures dynamic-sql sql-update

3
推荐指数
1
解决办法
4537
查看次数

将函数动态应用到 Postgres 表中的所有列

使用 Postgres 13.1,我想对表的所有列应用前向填充函数。前向填充函数在我之前的问题中进行了解释:

但是,在这种情况下,列和表是指定的。我想获取该代码并将其应用于任意表,即。指定一个表,并将前向填充应用于每一列。

以此表为例:

CREATE TABLE example(row_num int, id int, str text, val integer);
INSERT INTO example VALUES
  (1, 1, '1a', NULL)
, (2, 1, NULL,    1)
, (3, 2, '2a',    2)
, (4, 2, NULL, NULL)
, (5, 3, NULL, NULL)
, (6, 3, '3a',   31)
, (7, 3, NULL, NULL)
, (8, 3, NULL,   32)
, (9, 3, '3b', NULL)
, (10,3, NULL, NULL)
;
Run Code Online (Sandbox Code Playgroud)

我从该函数的以下工作基础开始。我称之为传递一些变量名。请注意,第一个是名而不是列名。该函数获取表名并创建所有列名的数组,然后输出名称。

create or replace function col_collect(tbl text, …
Run Code Online (Sandbox Code Playgroud)

sql postgresql null dynamic-sql plpgsql

3
推荐指数
1
解决办法
1667
查看次数

SQL状态:42601语法错误在"11"或附近

我有一个表address_all,它由几个地址表继承.address_history从父表继承history_all并保留当前地址信息.我正在创建一个新表继承address_all表并将信息复制address_history到新表.

我的存储过程如下所示.我打电话时遇到一些错误.为了更好地解释错误,我正在使用行号.

1  CREATE OR REPLACE FUNCTION somefunc()
2  RETURNS void AS
3  $BODY$
4  DECLARE
5   year_id INTEGER;
6   month_id INTEGER;
7   week_id INTEGER;
8   addresstablename text; 
9   backupdays text;
10 BEGIN
11  week_id := EXTRACT(DAY FROM TIMESTAMP 'now()');
12  month_id := EXTRACT(MONTH FROM TIMESTAMP 'now()');
13  year_id := EXTRACT(YEAR FROM TIMESTAMP 'now()');
14  addresstablename := 'address_history_' || week_id || '_' || month_id || '_' || year_id;
15  backupdays:= …
Run Code Online (Sandbox Code Playgroud)

postgresql datetime dynamic-sql plpgsql

2
推荐指数
1
解决办法
3万
查看次数

在PL / pgSQL中动态执行查询

我已经找到了我要在Oracle和SQL Server上解决的问题的解决方案(我认为),但是似乎无法将其转换为Postgres解决方案。我正在使用Postgres 9.3.6。

这个想法是为了生成用于分析目的的有关表内容的“元数据”。这只能通过让每一列都运行查询来找出(例如...)最小/最大/计数值等来完成(AFAIK)。为了使过程自动化,最好让数据库生成查询,然后执行查询。

使用示例salesdata表,我可以使用以下代码段为每列生成一个选择查询,并返回min()值:

SELECT 'SELECT min('||column_name||') as minval_'||column_name||' from salesdata '  
FROM information_schema.columns 
WHERE table_name = 'salesdata'
Run Code Online (Sandbox Code Playgroud)

优点是,无论列数如何,数据库都会生成代码。现在,我想到了无数个地方来存储这些查询,这些查询可以是某种变量,也可以是表列,其想法是执行这些查询。我想将生成的查询存储在变量中,然后使用EXECUTE(或EXECUTE IMMEDIATE)语句执行它们,这是此处采用的方法(请参见右窗格),但是Postgres不会让我在函数外部声明变量,因此我一直在抓挠我对如何将它们组合在一起,无论是什至是遵循的方向,也许还有更简单的东西。

您有任何指点吗,由于其他问题,我目前正在尝试类似的方法,但不知道我是否朝着正确的方向前进:

CREATE OR REPLACE FUNCTION foo()
RETURNS void AS
$$
DECLARE
    dyn_sql text; 
BEGIN            
dyn_sql := SELECT 'SELECT min('||column_name||') from salesdata'    
    FROM information_schema.columns 
    WHERE table_name = 'salesdata';
execute dyn_sql
END
$$ LANGUAGE PLPGSQL;    
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql plpgsql aggregate-functions dynamic-queries

2
推荐指数
1
解决办法
1万
查看次数