最近工作中遇到一个需求,需要更新Oracle数据库中所有表的一个字段“flag”为“I”,语句为:
update table_name set flag = 'I'
“I”作为字符串,所以语句中I需要加上单引号。
由于数据库中有多张表,我不想一条一条的语句写,希望能够通过sql语句直接生成所有的语句,所以写了如下sql:
select 'update ' || table_name || ' set flag = 'I'' || ';' from user_tables
这个时候运行,“报错
在SQL中,使用动态SQL是很常见的。有些复杂的计算,或是存储过程,代码很长,中间可能有多次执行SQL语句。而调试拼串的SQL语句却是件痛苦的事,很难看出来运行的语句是什么。所以我会经常使用print这个命令把运行前的语句打印到屏幕上,然后复制出来到另一个窗口进行调试、修改,这样就比较方便了。但是这个print命令有一些限制,在单字节符集下,最大只能打印打印8000个字符的长度,而在双字节字符集是4000个。
以下存储过程可以打印完整的信息,不受长度的限制。代码如下:
IF OBJECT_I