我目前正在处理一项任务,并要求通过读取JSON中的值来更新大约2000到4000条记录.我优化了JSON部分但是目前,我正在逐个更新每个记录.有人建议使用单一查询更新所有2000到4000条记录的最佳方法,而不是运行2000至4000次吗?这是我的示例代码
APEX_JSON.PARSE(V_OUTPUT_DATA);
plan_count := apex_json.get_count('plan');
IF plan_count > 0 THEN
FOR I in 1..plan_count LOOP
activities_count := APEX_JSON.get_count(p_path => 'plan['||i||'].activities');
IF activities_count > 0 THEN
FOR j in 2..(activities_count-1) LOOP
V_TASK_ID := APEX_JSON.get_varchar2(p_path => 'plan['||i||'].activities['||j||'].task_id');
V_SEQ := APEX_JSON.get_number(p_path => 'plan['||i||'].activities['||j||'].sequence');
UPDATE TABLE_NAME
SET ROUTE_SEQUENCE = V_SEQ, UPDATED_BY = 'SYSTEM',UPDATED_ON = SYSTIMESTAMP
WHERE TASK_ID = V_TASK_ID;
END LOOP;
COMMIT;
END IF;
END LOOP;
END IF;
Run Code Online (Sandbox Code Playgroud)
我应该使用2D阵列并使用它进行批量更新还是可以遵循其他方法?
已添加示例JSON
{
"plan": [{
"vehicle_id": "vehicle_1",
"activities": [{
"sequence": 0,
"timestamp": "2017-11-10T09:48:19Z",
"location_id": "depot"
}, …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个SQL查询,该记录将记录从一个表分发到另一个表,该表采用相同的数字.
在这个例子中,我有两个表,Students并且Teachers,我想将学生分配给每个教师.
学生:(亚当,班纳特,埃尔默,贾斯汀,路易斯,诺亚,杰克)
老师:( Leo,Kyle,Ethan)
注意:
例如,如果我们有七名学生和三名教师,前两名教师将招收两名学生,最后一名将招收三名学生.
结果:
Student | Teacher
--------+--------
Adam | Leo
Bennet | Leo
Elmer | Kyle
Justin | Kyle
Louis | Ethan
Noah | Ethan
Jack | Ethan
Run Code Online (Sandbox Code Playgroud)
我怎么能在Oracle SQL中做到这一点?
我正在尝试创建一个函数来从数据库中获取值列表。经过一些研究,我发现我需要使用PIPELINE函数,并找到了一些示例。我完成了我的功能,但不知何故出现了2个我不理解的错误。
这是我的代码:
CREATE OR REPLACE TYPE LISTE_VALUES AS TABLE OF VARCHAR2(2000);
/
CREATE OR REPLACE FUNCTION F_GET_VAL(
PI_1 IN VARCHAR2,
PI_2 IN NUMBER,
PI_3 IN VARCHAR2)
RETURN LISTE_VALUES PIPELINED
IS
W_ROW_COUNT NUMBER := 0;
BEGIN
FOR CUR IN (SELECT VALUE FROM TABLE
WHERE ...
...
)
LOOP
PIPE ROW (CUR);
W_ROUNT_COUNT := W_ROW_COUNT + 1;
END LOOP;
DBMS_OUTPUT.PUT_LINE('There were '
|| W_ROW_COUNT
|| ' rows selected' );
END F_GET_VAL;
/
Run Code Online (Sandbox Code Playgroud)
这些是我得到的错误:
[错误] PLS-00382:PLS-00382:表达式类型错误(在行:PIPE ROW(CUR);)
[错误] PLS-00201:PLS-00201:必须声明标识符“ W_ROUNT_COUNT”
(在一行:W_ROUNT_COUNT:= W_ROW_COUNT +1;) …
源表如下:
Id start_date end_date field1
1 01/03/2019 07/03/2019 text1
2 10/04/2019 15/04/2019 text2
Run Code Online (Sandbox Code Playgroud)
我想得到以下输出:
Id date field1
1 01/03/2019 text1
1 02/03/2019 text1
1 03/03/2019 text1
1 04/03/2019 text1
1 05/03/2019 text1
1 06/03/2019 text1
1 07/04/2019 text1
2 10/04/2019 text2
2 11/04/2019 text2
2 12/04/2019 text2
2 13/04/2019 text2
2 14/04/2019 text2
2 15/04/2019 text2
Run Code Online (Sandbox Code Playgroud)
我必须使用循环来填充此表吗?
谢谢
我正在尝试在sql中搜索有关此主题的信息,但搜索未显示结果。
SELECT * FROM TABLE(package/procedure/function);
Run Code Online (Sandbox Code Playgroud)
上面的sql语句属于哪个主题?我可以链接到文档吗?
我December 2018做了一个传递日期参数的函数时,很难像这样仅输出月份和年份
。
我用参数做了一个简单的函数,返回的日期仅显示下面的测试代码,显示日期和年份。month如上所述,我使用了mon代替了mon,但是在eg之间有一个差距December 2019。
function get_month(p_month DATE DEFAULT sysdate)
return VARCHAR2
is
v_month varchar2(50);
begin
select to_char(trunc(p_month), 'Month yyyy') into v_month from dual;
return v_month;
commit;
end;
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望以全名形式表示月份的输出,to_char(sysdate,'Month DDth, YYYY')但中间不要包含日。
我需要为存储的PL / SQL过程生成日志文件或写入日志表。如果我理解正确,则无法在存储过程中使用假脱机。我知道我可以使用UTL_FILE写入日志文件,但是我试图弄清楚如何获取一些我想编写的信息。假脱机处理时,在执行每个语句后都会得到某种结果字符串,例如“成功完成PL / SQL过程”或“选择了5行”。有没有办法获取该输出或类似的输出,以便我可以将它们放在日志中?
为什么此块不给出NULL错误?内。并使用其他任何指令引发错误(ORA-06502:PL / SQL:数字或值错误)?
BEGIN
IF 'x' = 1 THEN
NULL;
--dbms_output.put_line('test');
END IF;
END;
Run Code Online (Sandbox Code Playgroud) 是否有一个类似SQLERRM或SQLCODE包含引发错误的语句的变量?
例:
/*
if some error raised from this code
and I want to know which statement cause the failure..
I wish to use some oracle varaible to know it
*/
begin
select * from t1;
select * from t2;
exception when others
dbms_output.put_line(sqlerrm || ' raised from this statement:' || <some_variable>;
end;
-- excepted result: no data found raised from this statement: select * from t2
Run Code Online (Sandbox Code Playgroud)