当前位置: 首页 > 面试题库 >

如何使用PL / SQL中的循环多次运行同一查询?

龙俭
2023-03-14
问题内容

使用此代码,我无法多次运行插入查询。它仅询问ID和名称一次(如果counter中的值大于1)。

declare
        counter number := 0 ;
begin 
        counter := &counter ;
        while counter > 0 loop
               insert into customer values ( &id, '&name' ) ;
               counter := counter - 1 ;
       end loop ;
end ;

让我借助一个示例进行说明:-

假设我将值2放入counter。这样,它应该询问我两次ID和名称,但只询问一次,然后它将我为ID和名称输入的值复制到表中test两次。

我怎样才能解决这个问题?如果不能,请提出替代代码,以解决我的问题。


问题答案:

当PL / SQL块被编译时( 而不是 正在执行中)&counter,替换变量&id&name分别被评估一次。 __

在PL / SQL块中不能也不可以重新评估或提升变量。该块在数据库中作为一个单元执行-
一旦提交执行,它就独立于客户端,客户端仅等待它完成(除非您中断它,客户端也要处理)。PL /
SQL不是一种交互式语言,您不应将客户端功能(例如,替换变量)与SQL或PL / SQL功能混淆。

只是为了好玩,您可以生成一个脚本,基于counter该脚本执行适当数量的ID和名称提示,并将其转换为可以由简单插入使用的格式:

set serveroutput on
set feedback off
set echo off
set verify off
set termout off

accept counter "How many value pairs do you want to insert?"

var ids varchar2(4000);
var names varchar2(4000);

spool /tmp/prompter.sql

begin
  -- prompt for all the value pairs
  for i in 1..&counter loop
    dbms_output.put_line('accept id' ||i|| ' number  "Enter ID ' ||i|| '"');
    dbms_output.put_line('accept name' ||i|| '  char "Enter name ' ||i|| '"');
  end loop;

  -- concatenate the IDs into one variable
  dbms_output.put('define ids="');
  for i in 1..&counter loop
    if i > 1 then
      dbms_output.put(',');
    end if;
    dbms_output.put('&'||'id'||i);
  end loop;
  dbms_output.put_line('"');

  -- concatenate the names into one variable
  dbms_output.put('define names="');
  for i in 1..&counter loop
    if i > 1 then
      dbms_output.put(',');
    end if;
    -- each name wrapped in single quotes
    dbms_output.put(q'['&]'||'name'||i||q'[']');
  end loop;
  dbms_output.put_line('"');
end;
/
spool off

@/tmp/prompter

insert into customer (id, name)
select i.id, n.name
from (
  select rownum as rid, column_value as id 
  from table(sys.odcinumberlist(&ids))
) i
join (
  select rownum as rid, column_value as name
  from table(sys.odcivarchar2list(&names))
) n
on n.rid = i.rid;

select * from customer;

这将创建一个名为prompter.sql(我已将其放在/
tmp中;将其放置在适合您的环境的地方!)的文件;提示“值对数量”为2时,临时脚本将包含以下内容:

accept id1 number  "Enter ID 1"
accept name1  char "Enter name 1"
accept id2 number  "Enter ID 2"
accept name2  char "Enter name 2"
define ids="&id1,&id2"
define names="'&name1','&name2'"

然后使用来运行该临时脚本@,提示用户输入所有这些单独的值。然后,将根据组合的替换变量构建的表集合用于一个select中,该插入将使用该选择。



 类似资料:
  • 主要内容:标记PL/SQL循环,循环控制语句在本章中,我们将讨论和学习PL/SQL中的循环。当需要执行一段代码多次时可能会出现以下这种情况:一般来说,语句依次执行,首先执行函数中的第一个语句,然后执行第二个语句,依此类推。 编程语言提供了允许更复杂的执行路径的各种控制结构。 循环语句允许多次执行一个语句或一组语句,以下是大多数编程语言中循环语句的一般流程图 - PL/SQL提供以下类型的循环来处理循环需求。可点击以下链接查看每个循环类型如何

  • 问题内容: 当photoId直接在语句上而不是变量时,以下代码完全没有问题。 但是以下内容将无法正常运行,这可能是导致未选择该内容的原因。 这是在while循环内。 谢谢。 问题答案: 在php a和a中有很大的不同,查询语法在查询周围是双引号,在变量周围是单引号。。尽管我建议您在查询中使用参数,而不是直接将变量直接放入查询中 根据我的建议,您应该将查询更改为此: 这只是它的基本要点…如果您想了解

  • 问题内容: 我有一个带有表的数据库,该表充满了用于检查另一个数据库的条件和错误消息。 我想运行一个循环,以便对照第二个数据库中的所有表检查所有这些条件,并生成一个给出错误的报告。 这是可能的ms访问。 例如, querycrit表 我有超过400个类似这样的不同变量的查询。 我针对其运行查询的表是 记录表 问题答案: 这是更多示例代码。它说明了两种不同类型的记录集的用法。您可能希望阅读VBA陷阱:

  • 问题内容: 和别的: 两者都不起作用(强制关闭应用程序)。我可以尝试其他哪些选择? 问题答案: 您的代码失败,因为您在后台线程中执行睡眠,但是显示数据必须在UI线程中执行。 您必须从runOnUiThread(Runnable)运行displayData或定义处理程序并将消息发送给它。 例如:

  • 问题内容: 该表表示类别层次结构,层次结构顶部的元素的父ID为NULL。该表如下所示: 我正在尝试做的是建立一个SQL查询,这将使我返回: 任何给定[categoryId]的[categoryId],[categoryName]链。它应该循环并获取每一行,直到到达具有parentId == NULL的行为止。 如上面的示例示例234-> 91-> 35-> 20-> 1-> NULL(STOP)

  • 我刚接触Postman,遇到了一个我无法解决的经常性问题。我试图使用在预请求脚本上建立的数据数组多次运行同一个请求,但是,当我转到runner时,请求只运行一次,而不是3次。 预请求脚本: 测试: 我已经查看了文档,但我找不到我的代码有什么问题。 谢谢!