2017-04-13 88 views
0

我需要输入一个由逗号分隔的数字字符串,然后这些数字将被插入Oracle表中并附带一些其他信息。INSERT用户输入标准到表

我有以下代码将字符串和它分离成单独的数字,然后可以做一个INSERT,但不知道如何循环所需的次数来将每个输入的数字插入单独的Oracle表中的行。

任何人都可以帮忙吗?

DECLARE 
    stores VARCHAR2 (1000) := '&3'; 
    cnt number; 
BEGIN 

select count(*) into cnt from (
SELECT REGEXP_SUBSTR (stores, 
             '[^,]+', 
             1, 
             LEVEL) 
        FROM DUAL 
      CONNECT BY REGEXP_SUBSTR (stores, 
             '[^,]+', 
             1, 
             LEVEL) 
          IS NOT NULL); 
         DBMS_OUTPUT.put_line ('Stores in list   : ' || cnt); 


    END; 
/ 

回答

0

的结构将是沿着线:

declare 
    stores varchar2(1000) := '&3'; 
begin 
    for r in (
     select regexp_substr(stores, '[^,]+', 1, level) as store 
     from dual 
     connect by regexp_substr(stores, '[^,]+', 1, level) is not null 
    ) 
    loop 
     dbms_output.put_line(r.store); -- Add your INSERT etc here 
    end loop; 
end; 
/
+1

威廉,你的代码有“作为商店”,这是一个新的变量?是否应该宣布? – Dean

+0

[cursor for loop](https://docs.oracle.com/database/121/LNPLS/cursor_for_loop_statement.htm)根据其游标隐式定义记录,因此记录“r”将为每个列查询。在这种情况下,只有一列,“商店”。 –

+0

谢谢,昨天晚上我没有看到我需要使用r,但今天早上看到它,现在有完整的代码,可以启动并提供给我的用户。再次感谢。 – Dean

1

既然你是通过置换变量输入数字时,你可以这样做:

甲骨文设置

CREATE TABLE your_table (your_column_name NUMBER); 

PL/SQL块

DECLARE 
    stores SYS.ODCINUMBERLIST := SYS.ODCINUMBERLIST(&3); 
BEGIN 
    FORALL i IN 1 .. stores.COUNT 
    INSERT INTO your_table (your_column_name) VALUES (stores(i)); 
END; 
/

运行,然后输入值1,3,5,7

输出

SELECT * FROM your_table; 

输出:

YOUR_COLUMN_NAME 
---------------- 
       1 
       3 
       5 
       7 

如果你正在输入从绑定变量的字符串,那么你可以使用this function拆分字符串。

+0

对不起,这里有新内容。我的表使用varchar来存储stores参数,这是不能改变的。 – Dean

+0

不错的主意:) –

相关问题