我有一个带有nvarchar参数的存储过程.我希望调用者在使用此SP时为sql命令提供文本.
如何从SP内执行提供的sql命令?
这有可能吗? -
我认为可以使用EXEC,但以下内容:
EXEC @script
Run Code Online (Sandbox Code Playgroud)
错误表明它无法按给定名称查找存储过程.由于它是一个脚本,这显然是准确的,但让我觉得它没有按预期工作.
我有一些动态的sql语句,它在某些条件下发生轰炸,所以我试图调试它.它像这样构建:
declare @sql varchar(4000);
...
select @sql = '<part1>';
...
select @sql = @sql + '<part2>';
...
select @sql = @sql + '<part3>';
...
begin
execute(@sql);
select @ec__errno = @@error
if @ec__errno != 0
begin
if @@trancount != 0
begin
rollback;
end
return @ec__errno;
end;
...
Run Code Online (Sandbox Code Playgroud)
正如我所说,它在一个循环的特定迭代中爆炸(不要问我为什么这样实现,我只是修复了一个错误)并且我很难在监视窗口中显示字符串的内容.我想我只得到前255个字符.注意substring(@sql, 0, 200)结果'substring(@sql,0,200)' could not be evaluated.请帮忙.我希望能看到从0到199,从200到399的子串,依此类推,然后将这个东西拼凑起来,最后调试它.
我很感激你的指点.谢谢!
我试图使用强大的ref cur与动态sql语句,但它发出错误,但当我使用弱光标它工作,请解释是什么原因,请转发oracle服务器架构师的任何链接包含关于如何编译和解析在Oracle服务器中完成.这是代码中的错误.
ERROR at line 6:
ORA-06550: line 6, column 7:
PLS-00455: cursor 'EMP_REF_CUR' cannot be used in dynamic SQL OPEN statement
ORA-06550: line 6, column 2:
PL/SQL: Statement ignored
declare
type ref_cur_type IS REF CURSOR RETURN employees%ROWTYPE; --Creating a strong REF cursor,employees is a table
emp_ref_cur ref_cur_type;
emp_rec employees%ROWTYPE;
BEGIN
OPEN emp_ref_cur FOR 'SELECT * FROM employees';
LOOP
FETCH emp_ref_cur INTO emp_rec;
EXIT WHEN emp_ref_cur%NOTFOUND;
END lOOP;
END;
Run Code Online (Sandbox Code Playgroud) 如何从此代码中获取结果
EXECUTE IMMEDIATE 'SELECT * FROM ' || table_name
Run Code Online (Sandbox Code Playgroud)
通过循环
通常的方法看起来像这样
for items in (select * from this_table)
loop
htp.p(items.id);
end loop;
Run Code Online (Sandbox Code Playgroud) 我有一个SQL查询,我想动态指定列的名称.
假设我有一个名为的表TABLE_A,它有一个名称列ID.我想知道我是否可以这样做:
SELECT (SELECT 'ID'
FROM DUAL)
FROM TABLE_A
Run Code Online (Sandbox Code Playgroud)
显然这是不可能的.有更好的方法吗?
函数可以作为匿名函数直接存储在列中作为其值吗?
假设我想将此函数存储在列中.示例(伪代码):
表my_table:pk(int),my_function(func)
func(x){return x*100}
后来用它作为:
select
t.my_function(some_input) AS output
from
my_table as t
where t.pk = 1999
Run Code Online (Sandbox Code Playgroud)
每个pk的功能可能不同.
我正在使用SQL存储过程和动态SQL。当我尝试调试时,一切正常,直到打印出@columnName为止。
这是引起麻烦的代码部分:
DECLARE @query NVARCHAR(2000)
DECLARE @columnName NVARCHAR(250)
SELECT @query = 'SELECT myTable.value FROM myTable WHERE myConditions'
EXECUTE sp_executesql @query, N'@columnName NVARCHAR(30) OUTPUT', @columnName OUTPUT
PRINT N'query='+@query
set @query = ''
PRINT N'query after reset='+@query
PRINT N'columnName='+@columnName
PRINT N'any other message'
Select @query = 'SELECT myValues AS '''+@columnName+''',
FROM myTable2
WHERE myConditions';
EXEC(@query);
Run Code Online (Sandbox Code Playgroud)
这是输出消息:
query=SELECT myTable.value FROM myTable WHERE myConditions
query after reset=
any other message
Run Code Online (Sandbox Code Playgroud)
那么,我的columnName=输出在哪里?
编辑
SQL版本: Microsoft SQL Server 2012-11.0.2100.60(X64)2012年2月10日19:39:15版权所有(c)Windows NT 6.1(Build 7601:Service Pack 1)(Hypervisor)上的Microsoft …
我在我的应用程序中实现了某个功能,用户可以通过按下按钮并在此处插入一些值来动态地从用户界面编写查询.
用户根本不会看到生成的SQL语句.
我想知道是否有办法可以检查语法和语法(例如,他打开了动态生成的SQL的'parantheses'('并且忘了关闭它')以确保在实际执行之前不会发生运行时编译错误声明使用EXECUTE IMMEDIATE.
我正在尝试使用PL/pgSQL(PostgreSQL 9.3)实现一个函数,该函数返回一个与参数中的输入表具有相同结构的表.基本上,我想更新一个表,并使用plpgsql返回更新表的副本.我在SO周围搜索并发现了几个相关的问题(例如,返回动态表,其中包含来自PL/pgSQL函数的未知列和表名作为PostgreSQL函数参数),这导致了以下最小测试示例:
CREATE OR REPLACE FUNCTION change_val(_lookup_tbl regclass)
RETURNS _lookup_tbl%rowtype AS --problem line
$func$
BEGIN
RETURN QUERY EXECUTE format('UPDATE %s SET val = 2 RETURNING * ; ', _lookup_tbl);
END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
但我不能拿过去给正确的返回类型TABLE或SETOF RECORD在problem line.根据这个答案:
SQL要求在调用时知道返回类型
但我认为返回类型(我打算从输入表类型中借用)是已知的.有人可以帮助解释是否可以修复上述PL/pgSQL函数的签名?
注意,我需要参数化输入表并返回该表的更新.欢迎替代方案.
我经常在PostgreSQL(9.4.1)中重新创建一个表,就像这样:
DROP TABLE IF EXISTS test.foo;
CREATE TABLE test.foo AS
SELECT * FROM test.dagi_kommune
WHERE ST_Area(wkb_geometry) < 500;
Run Code Online (Sandbox Code Playgroud)
我想在表格中添加注释,说明创建表格的时间.创建基本注释没有问题,如下所示:
COMMENT ON TABLE test.foo IS 'Table create date: ';
Run Code Online (Sandbox Code Playgroud)
我还可以生成一个独立的时间戳,如下所示:
SELECT to_char(LOCALTIMESTAMP, 'YYYY-MM-DD HH:MI:SS');
Run Code Online (Sandbox Code Playgroud)
但是如果我试着把时间戳放在评论中,就像这样:
COMMENT ON TABLE test.foo IS to_char(LOCALTIMESTAMP, 'YYYY-MM-DD HH:MI:SS');
Run Code Online (Sandbox Code Playgroud)
我收到以下回复:
Run Code Online (Sandbox Code Playgroud)ERROR: syntax error at or near "to_char" LINE 10: COMMENT ON TABLE test.foo IS to_char(LOCALTIMESTAMP, 'YYYY-M... ^ ********** Error ********** ERROR: syntax error at or near "to_char" SQL state: 42601 Character: 276
如何在表格评论中加入当前的"日期和时间"?
dynamic-sql ×10
oracle ×4
sql ×4
plsql ×3
postgresql ×3
debugging ×2
cursor ×1
ddl ×1
oracle11g ×1
plpgsql ×1
polymorphism ×1
sql-server ×1
t-sql ×1
timestamp ×1