标签: dynamic-sql

存储过程是否可以在"IN"子句中使用动态参数?

我想运行这样的查询:

 SELECT * FROM Studio WHERE Id IN (134, 144, 132, 138, 7432, 7543, 2566)
Run Code Online (Sandbox Code Playgroud)

但传递给IN子句的Id数量仅在运行时确定.

我是否必须使用动态SQL,还是可以使用存储过程完成?

更新: 如果有可用的选项,哪一个更好?

谢谢.

t-sql stored-procedures dynamic-sql

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

可以在存储过程中使用动态SQL创建MySQL触发器吗?

是否可以在存储过程中使用动态生成的SQL在MySQL中创建触发器?我正在通过准备语句在我的过程中执行其他动态构造的查询,但是当我尝试相同的方法来创建触发器时,我得到以下错误:

错误代码:1295尚未在准备好的语句协议中支持此命令

Bug#31625开始,PREPARED STATEMENT语法不允许创建TRIGGERS我看到自2007年以来其他人一直抱怨同样的事情.

WL#2871的外观来看:准备任何尚未修复的SQL.

这个问题有解决方法吗?是否有另一种使用动态SQL创建触发器的方法?

基本上我要做的是动态创建触发器,用于记录各种不同表上插入的审计数据.我在*audit_tables*表中列出了我想要审核的表.下面的精简过程迭代该表中的条目并尝试创建触发器.

drop procedure if exists curtest;
delimiter |
create procedure curtest()
BEGIN
    DECLARE done INT DEFAULT 0;
    declare tn varchar(16);
    declare cur cursor for select table_name from audit_tables;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    OPEN cur;
    read_loop: LOOP
        fetch cur into tn;
        if done then
            leave read_loop;
        end if;

        /* Create the BEFORE INSERT trigger */
        set @sql = concat('CREATE TRIGGER audit_', …
Run Code Online (Sandbox Code Playgroud)

mysql triggers dynamic-sql

6
推荐指数
1
解决办法
2761
查看次数

MySQL连接表,其中表名是另一个表的字段

我有5张桌子.一个主要和另外四个(他们有不同的列).

  1. 对象
  2. obj_mobiles
  3. obj_tablets
  4. obj_computers

这是我的主表(对象)的结构.

ID | 类型| 名字| 等等...

所以我想要做的是将对象与其他(obj_mobiles,obj_tablets,...)表连接,具体取决于类型字段.我知道我应该使用动态SQL.但我无法制作程序.我认为应该看起来像这样.

SELECT objects.type into @tbl FROM objects;
PREPARE stmnt FROM "SELECT * FROM objects AS object LEFT JOIN @tbl AS info ON object.id = info.obj_id"; 
EXECUTE stmnt;
DEALLOCATE PREPARE stmnt;
Run Code Online (Sandbox Code Playgroud)

Aslo伪代码

SELECT * FROM objects LEFT JOIN [objects.type] ON ... 
Run Code Online (Sandbox Code Playgroud)

谁能发布程序?另外,我希望所有行不仅仅是1行.谢谢.

mysql dynamic-sql

6
推荐指数
1
解决办法
8600
查看次数

SQL Set IDENTITY字段使用变量

全部,我想IDENTITY根据从另一个表获得的当前最大值开始字段的编号.所以我尝试了类似下面的内容

DECLARE @CurrentES INT;
SET @CurrentES = (SELECT MaxES 
                  FROM [NDB]..[TmpMaxES]) + 1;
ALTER TABLE BA 
ADD ES INT IDENTITY(@CurrentES, 1);
Run Code Online (Sandbox Code Playgroud)

但是这不会接受变量作为IDENTITY中的种子值.我怎样才能实现我的目标?

谢谢你的时间.

t-sql dynamic-sql identity-column sql-server-2008

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

具有未知名称的PostgreSQL丢弃约束

我有一个SQL脚本需要删除几个约束并在最后恢复它们,但约束名称是自动生成的,并且每次运行脚本时都会有所不同.

我知道如何从表名中获取约束名称,但似乎不可能在drop语句中使用此信息.

select conname from pg_constraint where
   conrelid = (select oid from pg_class where relname='table name')
   and confrelid = (select oid from pg_class where relname='reference table');
Run Code Online (Sandbox Code Playgroud)

alter table something drop constraint (some subquery) 是语法错误.

理想情况下,我想得到约束名称并将其存储在一个变量中,但似乎Postgres不支持它,我不能使它与psql一起使用\set.

这甚至可能吗?

postgresql dynamic-sql plpgsql psql

6
推荐指数
1
解决办法
2031
查看次数

更新表名为参数的游标记录

我正在调整一些PL/pgSQL代码,所以我refcursor可以将表名作为参数.因此我更改了以下行:

declare
 pointCurs CURSOR FOR SELECT * from tableName for update;
Run Code Online (Sandbox Code Playgroud)

这一个:

OPEN pointCurs FOR execute 'SELECT * FROM ' || quote_ident(tableName) for update;
Run Code Online (Sandbox Code Playgroud)

我调整了循环,然后,循环经过了.现在在循环中的某个时刻我需要更新记录(由光标指向)并且我卡住了.我该如何正确调整以下代码行?

UPDATE tableName set tp_id = pos where current of pointCurs;
Run Code Online (Sandbox Code Playgroud)

我修改了tableName和的引号,并在开头pos添加了EXECUTE子句,但是我得到了错误where current of pointCurs.

问题:

(i)我如何更新记录?
(ii)该函数适用于来自公共模式的表,而来自其他模式的表(例如trace.myname)失败.

任何评论都非常感谢..

postgresql dynamic-sql plpgsql cursor sql-update

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

EXECUTE格式()中整数变量的格式说明符?

CREATE OR REPLACE FUNCTION getParentLtree(parent_id bigint, tbl_name varchar) 
  RETURNS ltree AS
$BODY$
DECLARE
   parent_ltree ltree;
BEGIN
-- This works fine:
-- select into parent_ltree l_tree from tbl1 where id = parent_id;

EXECUTE format('select into parent_ltree l_tree from %I
                where id = %I', tbl_name,parent_id);

RETURN parent_ltree;
END;
$BODY$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

上述功能有2个问题:

  1. parent_idinteger,但它会被替换引号?int变量的正确格式说明符是什么?
  2. select into不起作用EXECUTE?如何使上面的注释查询使用表名传递?

postgresql string-concatenation dynamic-sql plpgsql

6
推荐指数
2
解决办法
7021
查看次数

Yii:对动态列进行排序和格式化

我使用CSqlDataProvider从动态SQL查询中显示CGridView中的数据.有一些静态和一些动态列.现在我想在动态列中做一些像货币这样的特殊格式.但是,如果在执行查询之前我不知道列的数量/名称,我该怎么做呢.

此外,我希望能够对动态列进行排序,并且我有同样的问题,我没有所有的列名称.

在使用动态查询和gridview之前的任何人.请指点我正确的方向或提出一些想法如何做到这一点.

简而言之,我能够在gridview(也是动态行)中成功显示数据并对所有静态列进行排序.只需要对动态行进行排序并格式化动态和静态列

GridView的代码:

$tdata=$dataProvider->getData();
//Calculation to get column names
$grid_columns = array_keys($tdata[0]);

foreach($grid_columns as $i=>$ii)
{
//Applying Formula to get Total Row
$grid_final[$i] = array('name'=>$ii,'class'=>'bootstrap.widgets.TbTotalSumColumn'); 
}
//Grid View
$this->widget('bootstrap.widgets.TbExtendedGridView', array(
'sortableRows'=>true,
'afterSortableUpdate' => 'js:function(id, position){ console.log("id: "+id+", position:"+position);}',
'dataProvider'=>$dataProvider,
'type'=>'striped bordered',
'template' => "{items}\n{extendedSummary}",
'columns'=> $grid_final, 
 ));
Run Code Online (Sandbox Code Playgroud)

控制器代码:

public function actionIndex()
{

     if(isset($_GET['month']))
     {

       $month=$_GET['month'];
     }
     else
      {
       $month= 7;
      }
   //SQL Query with Dynamic Columns      
    $sql = "SELECt ABC,X,Y,Z, @Column_Names
            FROM some_table
            WHERE [month] = :month";

$connection=Yii::app()->db; …
Run Code Online (Sandbox Code Playgroud)

sql-server sorting gridview dynamic-sql yii

6
推荐指数
1
解决办法
737
查看次数

SELECT ... INTO的EXECUTE未实现

我试图在PostrgeSQL中运行此函数:

CREATE OR REPLACE FUNCTION create_partition_and_insert()
RETURNS trigger AS
$BODY$
DECLARE
partition VARCHAR(25);
_date text;
BEGIN
EXECUTE 'SELECT REPLACE(' || quote_literal(NEW.date) || ',''-'',''_'') into _date';
partition := TG_RELNAME || '_' || _date || ‘p’;
IF NOT EXISTS(SELECT relname FROM pg_class WHERE relname=partition) THEN
RAISE NOTICE 'A partition has been created %',partition;
EXECUTE 'CREATE TABLE ' || partition || ' (check (date = ''' || NEW.date || ''')) INHERITS (' || TG_RELNAME || ');';
END IF;
EXECUTE 'INSERT INTO ' || …
Run Code Online (Sandbox Code Playgroud)

postgresql triggers partitioning dynamic-sql plpgsql

6
推荐指数
1
解决办法
4004
查看次数

unaccent()不能与plpgsql动态查询中的希腊字母一起使用

我使用PostgreSQL 10并且我CREATE EXTENSION unaccent;成功运行.我有一个包含以下内容的plgsql函数 whereText := 'lower(unaccent(place.name)) LIKE lower(unaccent($1))';

之后,根据用户选择的内容,可以添加更多条款whereText.

whereText最终使用的查询:

placewithkeys := '%'||placename||'%';
RETURN QUERY EXECUTE format('SELECT id, name FROM '||fromText||' WHERE '||whereText)
     USING  placewithkeys , event, date;
Run Code Online (Sandbox Code Playgroud)

whereText := 'LOWER(unaccent(place.name)) LIKE LOWER(unaccent($1))';不起作用,即使我删除LOWER的部分.

我做的select __my_function('???');,我什么也没有回来,即使我应该回来的结果,因为在数据库中存在名称?????

如果我删除unaccent,并留下了LOWER它的工作原理,但没有口音:??带来了?????回来,因为它应该.这似乎unaccent是导致问题.

我错过了什么?我怎样才能解决这个问题?

由于有关于语法和可能的SQLi的评论,我提供了整个函数定义,现在更改为在希腊语中对重音不敏感和不区分大小写的工作:

CREATE  FUNCTION __a_search_place
(placename text, eventtype integer, eventdate integer, eventcentury integer, constructiondate integer, constructioncentury integer, arstyle integer, artype …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql plpgsql unaccent accent-insensitive

6
推荐指数
1
解决办法
382
查看次数