我正在尝试创建一个脚本来将数据从一个数据库迁移到另一个数据库.我目前无法做的一件事是将序列的nextval设置为另一个DB中序列的nextval.
我从user_sequences中获得了值的差异,并生成了以下动态SQL语句:
execute immediate 'alter sequence myseq increment by 100';
execute immediate 'select myseq.nextval from dual';
execute immediate 'alter sequence myseq increment by 1';
commit;
Run Code Online (Sandbox Code Playgroud)
但没有任何反应.我错过了什么?如果我在程序之外运行相同的语句,它们可以正常工作:
alter sequence myseq increment by 100;
select myseq.nextval from dual;
alter sequence myseq increment by 1;
commit;
Run Code Online (Sandbox Code Playgroud)
编辑:向所有人道歉,不清楚.我实际上正在改变同一个DB中的序列.我只是从远程数据库中获取值.也许没必要提到远程数据库,因为它不会影响事物.我只提到它来解释我的目标是什么.
步骤1.我从远程DB获取序列的nextval.
select (select last_number
from dba_sequences@remoteDB
where upper(sequence_name) = upper(v_sequence_name)) - (select last_number
from user_sequences
where upper(sequence_name) = upper(v_sequence_name)) increment_by
from dual;
Run Code Online (Sandbox Code Playgroud)
步骤2.我使用此值生成动态SQL语句:
execute immediate 'alter sequence myseq increment by 100';
execute immediate 'select myseq.nextval …Run Code Online (Sandbox Code Playgroud) 我正在尝试在PL/pgSQL中编写一个函数区域,它循环遍历hstore并将记录的列(其中的键hstore)设置为特定值(值hstore).我正在使用Postgres 9.1.
该hstore会是这样的:' "column1"=>"value1","column2"=>"value2" '
一般来说,这是我想要的一个函数,它接受hstore一个带有值的记录来修改:
FOR my_key, my_value IN
SELECT key,
value
FROM EACH( in_hstore )
LOOP
EXECUTE 'SELECT $1'
INTO my_row.my_key
USING my_value;
END LOOP;
Run Code Online (Sandbox Code Playgroud)
我在这段代码中得到的错误:
"myrow" has no field "my_key".我一直在寻找解决方案已经有一段时间了,但是我试图获得相同结果的其他一切都没有奏效.
我想基于存储过程输入构建自定义Where条件,如果不是null,那么我将在语句中使用它们,否则我将不使用它们.
if @Vendor_Name is not null
begin
set @where += 'Upper(vendors.VENDOR_NAME) LIKE "%"+ UPPER(@Vendor_Name) +"%"'
end
else if @Entity is not null
begin
set @where += 'AND headers.ORG_ID = @Entity'
end
select * from table_name where @where
Run Code Online (Sandbox Code Playgroud)
但是我得到了这个错误
An expression of non-boolean type specified in a context where a condition is expected, near 'set'.
Run Code Online (Sandbox Code Playgroud) 我编写了一个长达数千行的脚本,用于动态生成一些存储过程。
我想在存储过程的注释中引用生成存储过程的脚本,并且希望能够通过将脚本文件的行号插入到存储过程的注释中来引用脚本文件中的行文件。
例如,如果@@line_number 在下面的代码中给出了我想要的行号,那么@@line_number 应该是 5
1| declare @job varchar(max)
2| SET @job = '/* this is generated dynamicly by _______ */'
3| SET @job = @job + 'SELECT *' + CHAR(10)
4| SET @job = @job + 'FROM ' + @Table_Name + CHAR(10)
5| SET @job = @job + '/* ' + @@line_number + ' */'
Run Code Online (Sandbox Code Playgroud) 在存储过程 (A) 中,我需要在特定数据库中调用存储过程 (X) 并捕获输出。X 返回单个值。
据我所知,我需要将 X 的数据库名称提供给 A 中的存储过程,并且我需要使用动态 SQL 来构建针对所需数据库的执行查询。
我无法弄清楚的是如何从 A 中的 X 捕获输出以处理结果。
如果列存在,是否可以有条件地执行更新?例如,我可能在表中有一个列,如果该列存在,我希望执行该更新,否则,只需跳过它(或捕获其异常)。
我正在OUTPUT使用动态 SQL调用带有参数的存储过程。
set @cSql='EXEC '+@cName+'.dbo.uspNDateGet '''
+convert(varchar(10),@dtAsOn,102)+''','''
+@cBr+''','''
+@cLCode+''','''
+convert(varchar(10),@dtNDate,102)+''' OUTPUT'
exec(@cSql)
Run Code Online (Sandbox Code Playgroud)
在执行脚本时,我收到以下错误。
OUTPUT将常量传递给存储过程时不能使用该选项。
在不使用动态 SQL 的情况下,脚本给了我所需的结果。
EXEC uspNDateGet @dtAsOn,@cBr,@cLCode,@dtNDate OUTPUT
Run Code Online (Sandbox Code Playgroud) 我有一个带有长文本列的表.我希望能够选择所有列但限制文本列而无需编写每一列.
select * from resources;
Run Code Online (Sandbox Code Playgroud)
产生的输出太长而无法在psql中正确显示.我可以通过使用substr()或left()在长列上显示某些内容,但之后我需要指定每列.
select id, left(data, 50), file_format_version, ... from resources;
Run Code Online (Sandbox Code Playgroud)
当我查询第一个时,是否有一种方法可以让psql默认截断长列select * from resources?
这个使用参数的静态查询返回一行:
DECLARE @sqltext nvarchar(max)
DECLARE @status varchar(100)
SET @status = 'Active: Complete'
select * from status where StatusTitle = @status and type_id = 800
Run Code Online (Sandbox Code Playgroud)
但是,如下所示在动态SQL查询中使用该参数不会返回任何行:
SET @sqltext = 'SELECT s.StatusID
FROM [Status] s
WHERE (
( s.StatusTitle ='' + @status + '' )
AND s.[type_id] = 800 )'
EXECUTE sp_executesql @sqltext
Run Code Online (Sandbox Code Playgroud)
我知道WHERE子句有问题.我无法弄清楚如何纠正它.
我在执行以下代码时遇到问题,这给我一个错误,如下所示:
消息102,级别15,状态1,第3行'@ST'附近的语法不正确。
我可以尝试使用动态SQL来实现登录,但是想尝试该sp_executesql方法。如果发生语法错误,或者不应该将表名作为参数传递,请告诉我?
DECLARE @SQL NVARCHAR(4000)= '';
SET @SQL = N'--INSERT INTO #missingkeys ( SOURCE_KEY,[ROWCOUNT] )
SELECT S.[SOURCE_KEY], COUNT(1) AS [ROWCOUNT] FROM (SELECT DISTINCT @SK AS [SOURCE_KEY]
FROM [PDA].@ST ) AS S
LEFT JOIN [PDA].@MT AS T
ON T.[SOURCE_KEY] = S.[SOURCE_KEY]
GROUP BY S.[SOURCE_KEY]';
DECLARE @SOURCETABLE NVARCHAR(255)= 'FACT';
DECLARE @SOURCE_KEY NVARCHAR(255)= 'KEY', @MAP_TABLE NVARCHAR(255)= 'DimMap';
EXEC sp_executesql
@SQL,
N'@SK nvarchar(255), @ST nVARCHAR(255), @MT nVARCHAR(255)',
@SK = @SOURCE_KEY,
@ST = @SOURCETABLE,
@MT = @MAP_TABLE;
Run Code Online (Sandbox Code Playgroud) dynamic-sql ×10
sql-server ×6
postgresql ×3
sql ×3
t-sql ×2
composite ×1
line-numbers ×1
oracle ×1
output ×1
plpgsql ×1
plsql ×1
psql ×1
record ×1
select ×1
sequence ×1
sql-update ×1
where-clause ×1