CREATE OR REPLACE PROCEDURE get_dev_cs_1 IS sql_tem VARCHAR2(4000); v_dt NUMBER; BEGIN ----om_subscriber_yyyymm sql_tem := 'truncate table ycyd.yd_order_dev_3056'; EXECUTE IMMEDIATE sql_tem; FOR v_dt IN (SELECT to_number(substr(table_name, '15')) db FROM sys.all_tables a WHERE a.owner = upper('jour1') AND a.table_name LIKE upper('om_subscriber_202___') AND substr(table_name, '15') > 202205) LOOP -- 循环往b里添加数据 sql_tem := ' INSERT INTO ycyd.yd_order_dev_3056 SELECT a.order_id, a.done_date, a.cust_id, a.subscriber_ins_id, a.access_num, c.dev_id, c.dev_name, c.dev_busi_code, c.corp_org, c.company_name, c.department_code, c.department_name, c.remarks FROM JOUR1.om_subscriber_' || v_dt.db || ' a LEFT JOIN JOUR1.om_order_' || v_dt.db || ' b ON a.order_id = b.order_id LEFT JOIN params1.sec_developer c ON b.dev_id = c.dev_id WHERE c.corp_org = 3056'; -- 执行sql EXECUTE IMMEDIATE sql_tem; END LOOP; END get_dev_cs_1; 无法插入数据
时间: 2024-04-15 09:25:47 浏览: 118
根据你提供的存储过程代码,我看到在循环中使用了动态SQL执行。你遇到的问题可能与动态SQL的执行有关。为了更好地帮助你,我需要了解一下出现问题的具体错误消息或者是无法插入数据的具体表现。
另外,你可以尝试以下几个步骤来排查问题:
1. 确保表"ycyd.yd_order_dev_3056"已经存在并且你有插入数据的权限。
2. 检查动态SQL语句的拼接是否正确,特别是变量v_dt.db的值是否正确。
3. 检查表"params1.sec_developer"中是否存在满足条件"c.corp_org = 3056"的记录。
如果你能提供更多的错误信息或者表现情况,我将能够更准确地帮助你解决问题。
相关问题
begin get_dev_cs; end; 运行后没有数据插入制定表 get_dev_cs 代码如下CREATE OR REPLACE PROCEDURE get_dev_cs IS sql_tem VARCHAR2(4000); v_dt NUMBER; BEGIN sql_tem := 'truncate table ycyd.Subscriber_cs'; EXECUTE IMMEDIATE sql_tem; FOR v_dt IN (SELECT to_number(substr(table_name, '15')) db FROM sys.all_tables a WHERE a.owner = upper('jour1') AND a.table_name LIKE upper('om_subscriber_202___') AND substr(table_name, '15') > 202205) LOOP -- 循环往b里添加数据 sql_tem := ' INSERT INTO ycyd.Subscriber_cs SELECT a.order_id, a.done_date, a.cust_id, a.subscriber_ins_id, a.access_num FROM jour1.om_subscriber_' || v_dt.db || ' a WHERE a.action = 0'; -- 执行sql EXECUTE IMMEDIATE sql_tem; END LOOP; END;
根据你提供的代码,我看到了可能导致没有数据插入指定表的问题。在存储过程 `get_dev_cs` 中,你在循环之前执行了 `truncate table ycyd.Subscriber_cs` 的操作,这会清空表中的所有数据。因此,在循环中执行插入操作时,可能没有符合条件的数据可供插入。
如果你希望每次循环前清空表中的数据,你可以将 `truncate` 操作移到循环之外。以下是修改后的代码:
```sql
CREATE OR REPLACE PROCEDURE get_dev_cs IS
sql_tem VARCHAR2(4000);
v_dt NUMBER;
BEGIN
sql_tem := 'truncate table ycyd.Subscriber_cs';
EXECUTE IMMEDIATE sql_tem;
FOR v_dt IN (SELECT to_number(substr(table_name, '15')) db
FROM sys.all_tables a
WHERE a.owner = upper('jour1')
AND a.table_name LIKE upper('om_subscriber_202___')
AND substr(table_name, '15') > 202205) LOOP
-- 循环往表里添加数据
sql_tem := '
INSERT INTO ycyd.Subscriber_cs
SELECT a.order_id,
a.done_date,
a.cust_id,
a.subscriber_ins_id,
a.access_num
FROM jour1.om_subscriber_' || v_dt.db || ' a
WHERE a.action = 0';
-- 执行SQL语句
EXECUTE IMMEDIATE sql_tem;
END LOOP;
END;
```
在修改后的代码中,我们将 `truncate` 操作移到循环之外,这样在每次循环之前都会清空表中的数据。这样,每次循环都可以插入符合条件的数据到表中。
请注意,代码中还有其他可能需要根据实际情况进行调整的部分,比如表名、列名、条件等。在执行这段代码之前,请确保你已经根据实际情况进行了适当的修改。
CREATE OR REPLACE PROCEDURE get_dev_cs IS sql_tem VARCHAR2(4000); v_dt NUMBER; BEGIN FOR v_dt IN (SELECT to_number(substr(table_name, '15')) db FROM sys.all_tables a WHERE a.owner = upper('jour1') AND a.table_name LIKE upper('om_subscriber_202___') AND substr(table_name, '15') > 202205) LOOP -- 循环往b里添加数据 sql_tem := ' INSERT INTO ycyd.Subscriber_cs SELECT a.order_id, a.done_date, a.cust_id, a.subscriber_ins_id, a.access_num FROM jour1.om_subscriber_ ' || v_dt || ' a WHERE a.action = 0'; -- 执行sql EXECUTE IMMEDIATE sql_tem; END LOOP; END ; 调用'||'时参数个数或类型错误 修正代码
在你提供的代码中,有一个错误导致了参数个数或类型错误。问题出在循环中拼接 SQL 语句时,你没有将 `v_dt` 转换为字符串类型。下面是修正后的代码:
```sql
CREATE OR REPLACE PROCEDURE get_dev_cs IS
sql_tem VARCHAR2(4000);
v_dt NUMBER;
BEGIN
FOR v_dt IN (SELECT to_number(substr(table_name, '15')) db
FROM sys.all_tables a
WHERE a.owner = upper('jour1')
AND a.table_name LIKE upper('om_subscriber_202___')
AND substr(table_name, '15') > 202205) LOOP
-- 循环往b里添加数据
sql_tem := '
INSERT INTO ycyd.Subscriber_cs
SELECT a.order_id,
a.done_date,
a.cust_id,
a.subscriber_ins_id,
a.access_num
FROM jour1.om_subscriber_' || v_dt.db || ' a
WHERE a.action = 0';
-- 执行sql
EXECUTE IMMEDIATE sql_tem;
END LOOP;
END ;
```
在修正后的代码中,我们使用 `v_dt.db` 来获取循环中的每个迭代的值,并将其作为字符串类型拼接到 SQL 语句中。
请注意,代码中还有其他可能需要根据实际情况进行调整的部分,比如表名、列名、条件等。在执行这段代码之前,请确保你已经根据实际情况进行了适当的修改。
阅读全文