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 后面部能使用变量!!
现在呢我,使用创建零时表,将值取出来,循环结束后,将表中的数据删了!请问还有更好的方法吗????谢谢了
使用游标是不是更麻烦了?????

参考技术A 可以用游标实现:

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并标明列明

mysql 查询结果把一个字段的值赋值给另一个字段的键值

开发中遇到的问题---使用mybatis时 有一个sql查询不到结果 日志也显示查询为o 但是从日志中取出执行的sql到数据库客户端手动执行,可以查到数据

Sql中如何给变量赋值

存储过程给变量赋值