标签: plsql

Oracle 12.1.0.2中的批量更新?

我目前正在处理一项任务,并要求通过读取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)

oracle plsql oracle12c bulkupdate

2
推荐指数
1
解决办法
85
查看次数

如何自动杀死活动会话oracle

我想在开始时间大于1小时时自动杀死会话oracle,请帮忙,我该怎么做.

sql oracle plsql

2
推荐指数
2
解决办法
971
查看次数

我想将一个表中的行分发到其他表中的行,这些行可以在SQL oracle中使用相同的行数

我正在尝试编写一个SQL查询,该记录将记录从一个表分发到另一个表,该表采用相同的数字.

在这个例子中,我有两个表,Students并且Teachers,我想将学生分配给每个教师.

学生:(亚当,班纳特,埃尔默,贾斯汀,路易斯,诺亚,杰克)

老师:( Leo,Kyle,Ethan)

注意:

  1. 一个学生不能有一个以上的老师
  2. 每个老师应该和其他老师一样有相同数量的学生......
  3. ......除非学生人数不是教师人数的精确倍数,否则学生必须尽可能在教师之间平均分配

例如,如果我们有七名学生和三名教师,前两名教师将招收两名学生,最后一名将招收三名学生.

结果:

Student | Teacher
--------+--------
Adam    | Leo
Bennet  | Leo
Elmer   | Kyle
Justin  | Kyle
Louis   | Ethan
Noah    | Ethan
Jack    | Ethan
Run Code Online (Sandbox Code Playgroud)

我怎么能在Oracle SQL中做到这一点?

sql oracle plsql

2
推荐指数
1
解决办法
111
查看次数

PLSQL流水线函数返回列表

我正在尝试创建一个函数来从数据库中获取值列表。经过一些研究,我发现我需要使用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;) …

oracle plsql function pipelined-function

2
推荐指数
1
解决办法
128
查看次数

从两个日期列生成日期范围

源表如下:

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 oracle plsql oracle11g

2
推荐指数
1
解决办法
82
查看次数

在Oracle中,[select from table()]是什么意思?

我正在尝试在sql中搜索有关此主题的信息,但搜索未显示结果。

SELECT * FROM TABLE(package/procedure/function);
Run Code Online (Sandbox Code Playgroud)

上面的sql语句属于哪个主题?我可以链接到文档吗?

sql oracle plsql

2
推荐指数
1
解决办法
185
查看次数

有没有一种方法可以格式化日期以仅在plsql中显示月份和年份?

我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')但中间不要包含日。

sql oracle plsql date-formatting

2
推荐指数
1
解决办法
70
查看次数

如何手动生成与SQL * Plus假脱机结果相同的日志文件

我需要为存储的PL / SQL过程生成日志文件或写入日志表。如果我理解正确,则无法在存储过程中使用假脱机。我知道我可以使用UTL_FILE写入日志文件,但是我试图弄清楚如何获取一些我想编写的信息。假脱机处理时,在执行每个语句后都会得到某种结果字符串,例如“成功完成PL / SQL过程”或“选择了5行”。有没有办法获取该输出或类似的输出,以便我可以将它们放在日志中?

oracle plsql

2
推荐指数
1
解决办法
46
查看次数

为什么比较varchar / number有效

为什么此块不给出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)

sql oracle plsql

2
推荐指数
1
解决办法
56
查看次数

哪个命令引发了异常?

是否有一个类似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)

oracle plsql exception

2
推荐指数
1
解决办法
54
查看次数