【问题标题】:Oracle SQL insert into table a user ID and a value of a list of stringsOracle SQL 向表中插入用户 ID 和字符串列表的值
【发布时间】:2019-09-21 00:55:09
【问题描述】:

我想执行以下操作,但我缺乏执行此操作的 Oracle SQL 知识。

我希望将用户标识作为字符串,然后将字符串列表作为过程的参数。

在此过程中,我希望为该列表中的每个值插入一个表,每次都使用相同的用户 ID。

我的问题:

我找不到如何声明输入参数以使其成为列表的示例。我需要把它变成一个长的varchar吗?我大致知道如果列表完全填写,最大长度可能是多少,但我想知道是否有某种列表的数据类型?

如何循环遍历列表。

我看到很多这样的例子:

FOR r IN ('The', 'Quick', 'brown', 'fox')
LOOP
    // Do stuff
END LOOP;

那么这是否意味着我应该将我的列表作为带有逗号分隔值的单个字符串提供?我想知道是否还有其他方法可以做到这一点。

【问题讨论】:

  • 我是否为每个用户/区域对进行调用?当然,为什么不呢? 或者我可以发送一个字符串列表并在程序中解决这个问题吗? 当然,为什么不呢?这个问题不太适合该网站,因为我们更喜欢可以回答的问题而不是仅仅讨论过的问题 - 这个问题似乎主要是为了获得意见
  • 如果我确实发送了列表,那么我该如何在 SQL 代码中进行处理。我从未见过遍历列表并为遇到的每个值进行插入的示例。
  • 嗯,它的工作原理和你说的差不多……而且这个问题是可以回答的
  • 我将尝试更好地改写问题。

标签: c# oracle plsql


【解决方案1】:

用N个不同的字符串执行相同的插入N次

string[] things = new[]{"foo", "bar", "baz");

SomeSqlCommand sql = new SomeSqlCommand("INSERT INTO table(a, b) VALUES(@a, @b)", "some connection string");
sql.Parameters.AddWithValue("@a", "fixed value");
sql.Parameters.AddWithValue("@b", "dummy value - will change in loop");

sql.Connection.Open();

foreach(string thing in things)
{
  sql.Parameters["@b"].Value = thing;
  sql.ExecuteNonQuery();
}

sql.Connection.Close();

为了清楚起见,省略了使用等;基本前提:设置参数化SQL,设置参数值,执行,更改值,再次执行……

当我使用 Oracle 时,参数名称前面有一个冒号;不知道这是否仍然正确。将其视为伪代码(它更像 SQLServer 语法)并将概念合并到您现有的 Oracle 样式中

【讨论】:

  • 谢谢,我试图改写我的问题,以便更清楚我的意思,并且它是可回答的;我遇到困难的部分是存储过程内部,即查询代码本身。
【解决方案2】:

这是您可能需要考虑的 (PL/)SQL 选项。

出于测试目的,我创建了一个 TEST 表,其中将包含 ID - VALUE 对。该过程接受两个参数,都是字符串:

  • ID 将适用于所有值
  • VALUE 是一个逗号分隔值列表。虽然您可以传递一个集合,但我建议您使用 VARCHAR2,因为它非常易于维护

SELECT 在过程中使用带有正则表达式的分层查询;其目的是将逗号分隔的值字符串拆分为行,以便您可以将每个值插入到自己的行中。这样做,您甚至不需要循环。此外,SELECT 即使您运行它独立 也可以工作,但是 - 您需要一个过程。

好的,就这样吧:

SQL> create table test (id varchar2(10), value varchar2(20));

Table created.

SQL> create or replace procedure p_ins (par_id    in varchar2,
  2                                     par_value in varchar2)
  3  is
  4  begin
  5    insert into test (id, value)
  6      select par_id,
  7             trim(regexp_substr(par_value, '[^,]+', 1, level))
  8      from dual
  9      connect by level <= regexp_count(par_value, ',') + 1;
 10  end;
 11  /

Procedure created.

测试:

SQL> begin
  2    p_ins('A', 'The, quick, brown fox, runs, or, whatever, it does');
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL> select * from test;

ID         VALUE
---------- --------------------
A          The
A          quick
A          brown fox
A          runs
A          or
A          whatever
A          it does

7 rows selected.

【讨论】:

    猜你喜欢
    • 2012-05-12
    • 2016-04-06
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 2013-09-05
    • 2012-12-04
    相关资源
    最近更新 更多