sql2000 取出每行数据,并赋值给变量。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql2000 取出每行数据,并赋值给变量。相关的知识,希望对你有一定的参考价值。
取出一个数据列表如下:
主管部门:
安德莱
鸿运
百威
夏邑
现在我需要取出每行的主管部门。并赋值到变量@pro
用2005可以写成:
select top 1 @pro=主管部门 from 表 where not(主键 in (select top @i 主键 from 表))
现在2000好像不能使用
select top @i
也就是top 后面部能使用变量!!
现在呢我,使用创建零时表,将值取出来,循环结束后,将表中的数据删了!请问还有更好的方法吗????谢谢了
使用游标是不是更麻烦了?????
declare @pro as nvarchar(100)
declare cur1 cursor for
select 主管部门 from 表
open cur1 --打开游标
fetch next from cur1 into @pro
while @@fetch_status=0
begin
--此块部分添加你自己的sql语句,如 print @pro
fetch next from cur1 into @pro
end
close cur1 --关闭游标
deallocate cur1 --释放游标
为变量赋值并调用多个命令
【中文标题】为变量赋值并调用多个命令【英文标题】:Assign value to Variable and call in multiple commands 【发布时间】:2019-05-21 21:54:56 【问题描述】:我需要从选择查询输出中为变量赋值,并将变量调用到 sql 命令中
例如:我从 v$pdbs 获取 PDB_NAME 并将值分配给 v_pdb 我想在多个 sql 命令中使用 v_pdb 来针对 PDB 运行
我尝试将 SELECT 查询中的值分配给 v_pdb 并在 'alter session set container=v_pdb' 中调用 v_pdb;它看起来可以工作,但我得到 ORA-00922: missing or invalid option 错误
set serveroutput on;
declare
v_sql varchar2(80);
v_pdb varchar2(30);
BEGIN
FOR pdb IN (select name from v$pdbs where con_id=3 and OPEN_MODE='READ WRITE')
LOOP
v_sql := 'alter session set container='||pdb.name;
DBMS_OUTPUT.PUT_LINE('Executing: ' || v_sql);
--execute immediate 'alter session set container='||pdb.name||';';
execute immediate v_sql;
--v_sql := 'show con_name';
--execute immediate 'show con_name';
--execute immediate v_sql;
v_sql := 'create tablespace APPDATA datafile '+DATA' size 1G autoextend on next 100M maxsize 5G ENCRYPTION USING 'AES256' DEFAULT STORAGE (ENCRYPT)';
DBMS_OUTPUT.PUT_LINE('Executing: ' || v_sql);
execute immediate v_sql;
v_sql := 'drop user bigschema cascade';
DBMS_OUTPUT.PUT_LINE('Executing: ' || v_sql);
--execute immediate 'drop user bigschema cascade';
execute immediate v_sql;
v_sql := 'create user bigschema identified by B67_kuca_ecdf default tablespace APPDATA temporary tablespace TEMP profile DEFAULT account unlock';
DBMS_OUTPUT.PUT_LINE('Executing: ' || v_sql);
execute immediate v_sql;
v_sql := 'alter user bigschema quota unlimited on APPDATA';
DBMS_OUTPUT.PUT_LINE('Executing: ' || v_sql);
execute immediate v_sql;
v_sql := 'grant dba to bigschema';
DBMS_OUTPUT.PUT_LINE('Executing: ' || v_sql);
execute immediate v_sql;
v_sql := 'conn bigschema/"B67_kuca_ecdf"@'||pdb.name;
DBMS_OUTPUT.PUT_LINE('Executing: ' || v_sql);
execute immediate v_sql;
v_sql := 'drop table MV2OCI';
DBMS_OUTPUT.PUT_LINE('Executing: ' || v_sql);
execute immediate v_sql;
v_sql := 'create table MV2OCI tablespace APPDATA as select * from dba_objects';
DBMS_OUTPUT.PUT_LINE('Executing: ' || v_sql);
execute immediate v_sql;
v_sql := 'alter table MV2OCI nologging';
DBMS_OUTPUT.PUT_LINE('Executing: ' || v_sql);
execute immediate v_sql;
v_sql := 'show user';
DBMS_OUTPUT.PUT_LINE('Executing: ' || v_sql);
execute immediate v_sql;
v_sql := 'insert into MV2OCI select * from dba_objects';
DBMS_OUTPUT.PUT_LINE('Executing: ' || v_sql);
execute immediate v_sql;
v_sql := 'insert into MV2OCI select * from MV2OCI';
DBMS_OUTPUT.PUT_LINE('Executing: ' || v_sql);
execute immediate v_sql;
END LOOP;
END;
/
我只是想从 "select name from v$pdbs where con_id=3 and OPEN_MODE='READ WRITE'" 中获取变量 v_pdb 的值
并按如下方式调用v_pdb:
改变会话集容器=v_pdb; 运行其他 sql 命令 ... ......
【问题讨论】:
尝试v_pdb := pdb.name;
作为循环体的第一行。
【参考方案1】:
我认为问题出在动态 SQL 中的尾随分号上。动态 SQL 不包含尾随分号 -- 因为动态 SQL 是单个语句,所以不需要语句分隔符。
删除尾随分号(和“show”命令(客户端命令))后,一切正常。但我不知道有什么好方法可以让DBMS_OUTPUT
运行,除非您已经在给定的 PDB 中。在此示例中已删除。
declare
v_sql varchar2(80);
BEGIN
FOR pdb IN (select name from v$pdbs where con_id=3 and OPEN_MODE='READ WRITE')
LOOP
v_sql := 'alter session set container='||pdb.name;
execute immediate V_SQL;
DBMS_OUTPUT.ENABLE;
v_sql := 'CREATE TABLE TEST_TABLE(LOREM_IPSUM NUMBER)';
execute immediate V_SQL;
END LOOP;
END;
/
结果:
PL/SQL procedure successfully completed.
导航到 PDB,TEST_TABLE
现在存在于那里。
【讨论】:
谢谢,但它看起来不像使用 show con_name 命令我需要在设置“alter session set container=pdb;”后运行多个 SQL 语句将 select * from dual 替换为 show con_name v_sql := 'show con_name'; 时出现错误/SQL> 2 3 4 5 6 7 8 9 10 11 12 13 14 正在执行:alter session set container=PDB1D002 正在执行:show con_name declare * ERROR at line 1: ORA-00900: invalid SQL statement ORA-06512: at line 11 ORA -06512:在第 11 行 感谢 user918753。 "SHOW" 是一个 sqlplus/sqlcl 命令 -- sqlplus/sqlcl 查看 "show" 并实际运行其他命令以收集其他信息以显示在终端中。 SQLPlus 命令不能在动态 SQL 中运行,只有有效的 SQL 或 PL/SQL 可以在execute immediate
块中执行。您可以改为运行有效的 SQL 语句来获取连接名称并对其进行任何需要的操作。【参考方案2】:
我认为它实际上与您的 pdb 变量没有任何关系...
当您使用立即执行时,您不能使用 ;在字符串中
因此,对于您的每个执行即时语句,请删除 ;例如
execute immediate 'alter session set container='||pdb.name||';';
变成
execute immediate 'alter session set container='||pdb.name;
【讨论】:
【参考方案3】:有几种方法可以改进代码和编码过程:
-
从动态 SQL 中排除语句终止符:正如其他人所提到的,从动态 SQL 中使用的 SQL 语句的末尾删除
;
。
转义字符串:字符串中的字符串需要转义。字符串'DATA'
应该是''DATA''
。
注意完整的错误信息:始终显示整个错误信息,包括行号和列号。该信息准确地指出了问题所在。
使用尽可能小的示例:smaller example 的错误更少,更容易找到真正的问题。在简化示例的过程中,您可能会自己找到答案。
【讨论】:
以上是关于sql2000 取出每行数据,并赋值给变量。的主要内容,如果未能解决你的问题,请参考以下文章
sql server 2000 如何把select的值赋给一个变量
python 数据库查询到的结果如何能赋值给dataframe并标明列明
开发中遇到的问题---使用mybatis时 有一个sql查询不到结果 日志也显示查询为o 但是从日志中取出执行的sql到数据库客户端手动执行,可以查到数据