我想运行这样的查询:
SELECT * FROM Studio WHERE Id IN (134, 144, 132, 138, 7432, 7543, 2566)
Run Code Online (Sandbox Code Playgroud)
但传递给IN子句的Id数量仅在运行时确定.
我是否必须使用动态SQL,还是可以使用存储过程完成?
更新: 如果有可用的选项,哪一个更好?
谢谢.
是否可以在存储过程中使用动态生成的SQL在MySQL中创建触发器?我正在通过准备语句在我的过程中执行其他动态构造的查询,但是当我尝试相同的方法来创建触发器时,我得到以下错误:
错误代码:1295尚未在准备好的语句协议中支持此命令
从Bug#31625开始,PREPARED STATEMENT语法不允许创建TRIGGERS我看到自2007年以来其他人一直抱怨同样的事情.
这个问题有解决方法吗?是否有另一种使用动态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) 我有5张桌子.一个主要和另外四个(他们有不同的列).
这是我的主表(对象)的结构.
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行.谢谢.
全部,我想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中的种子值.我怎样才能实现我的目标?
谢谢你的时间.
我有一个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.
这甚至可能吗?
我正在调整一些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)失败.
任何评论都非常感谢..
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个问题:
parent_id是integer,但它会被替换引号?int变量的正确格式说明符是什么?select into不起作用EXECUTE?如何使上面的注释查询使用表名传递?我使用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) 我试图在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 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) dynamic-sql ×10
plpgsql ×5
postgresql ×5
mysql ×2
t-sql ×2
triggers ×2
cursor ×1
gridview ×1
partitioning ×1
psql ×1
sorting ×1
sql-server ×1
sql-update ×1
unaccent ×1
yii ×1