标签: plsql

选择存储过程plsql

我对Oracle中的存储过程语法感到有点困惑.

我从一个简单的开始:

select * from test_table;
Run Code Online (Sandbox Code Playgroud)

它工作,然后我把它放在一个proc:

CREATE OR REPLACE PROCEDURE example
IS
BEGIN
   select * from test_table;
END;
Run Code Online (Sandbox Code Playgroud)

不行.预期的"INTO"是我收到的错误消息.现在,我已经看到SQL Server代码的语法示例,它只是将一个select语句推送到一个proc中,它立即起作用,但这似乎并非如此.

sql database oracle plsql stored-procedures

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

避免在具有多个条件的If语句中进行硬编码

我有一段PL/SQL代码看起来类似于:

IF l_order = 'Cancelled At Order Stage' OR l_order = 'Stopped at Billing Stage' THEN
    Do something
END IF;

IF l_type = 'Internal' OR l_type = 'Contracted' THEN
    Do something else
END IF;
Run Code Online (Sandbox Code Playgroud)

我想避免使用硬编码字符串,所以我认为是一个简单的数组.然而,它似乎是很多额外的代码行(创建一个类型,创建一个类型的数组,迭代该数组)只是为了做我在这里得到的.

关于该怎么做的建议是什么?我知道这是一个非常小的问题,我可能是微观优化,但我想知道什么是好的做法.

sql arrays oracle plsql

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

Oracle:推迟开始/结束块中的约束?

如何在开始/结束块中推迟约束?

这有效:

SQL> set constraint t_pk deferred;                                              
Constraint set.
Run Code Online (Sandbox Code Playgroud)

但是相同的语句在开始/结束块中失败:

SQL> begin
2  set constraint t_pk deferred;
3  end;
4  /
set constraint t_pk deferred;
    *
ERROR at line 2:
ORA-06550: line 2, column 5:
PL/SQL: ORA-00922: missing or invalid option
ORA-06550: line 2, column 1:
PL/SQL: SQL Statement ignored
Run Code Online (Sandbox Code Playgroud)

oracle plsql constraints

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

如何使用RECORD TYPE作为OUT参数执行存储过程

这是包规范:

create or replace PACKAGE EMPLOYEE_DETAILS AS

        TYPE DETAILS IS RECORD( 
        EMPLOYEE_ID NUMBER(6,0),
          EMPLOYEE_FIRST_NAME VARCHAR2(20),
          EMPLOYEE_LAST_NAME VARCHAR2(25)
          );

        TYPE TABLE_EMPLOYEES IS TABLE OF DETAILS;

        PROCEDURE GET_EMPLOYEES(
        EMP_DEPT_ID EMPLOYEES.DEPARTMENT_ID%TYPE,
        EMP_SALARY employees.salary%TYPE,
        TBL_EMPLOYEES OUT TABLE_EMPLOYEES
        );

        END EMPLOYEE_DETAILS;
Run Code Online (Sandbox Code Playgroud)

而这就是包装体.我能够编译包,但需要一些帮助来执行存储过程来验证结果.

create or replace PACKAGE BODY EMPLOYEE_DETAILS AS

    PROCEDURE GET_EMPLOYEES(
    EMP_DEPT_ID EMPLOYEES.DEPARTMENT_ID%TYPE, 
    EMP_SALARY employees.salary%TYPE,
    TBL_EMPLOYEES OUT TABLE_EMPLOYEES
)

IS
    LC_SELECT SYS_REFCURSOR;
    LR_DETAILS DETAILS;
    TBL_EMPLOYEE TABLE_EMPLOYEES;

BEGIN
    OPEN LC_SELECT FOR 
        SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME 
        FROM EMPLOYEES
        WHERE DEPARTMENT_ID=EMP_DEPT_ID
        AND EMPLOYEES.SALARY>EMP_SALARY;

    LOOP 
        FETCH LC_SELECT INTO LR_DETAILS;
        EXIT WHEN …
Run Code Online (Sandbox Code Playgroud)

oracle plsql stored-procedures out-parameters recordtype

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

重构没有游标PL/SQL的代码

如何在不使用的情况下重构这些代码行CURSOR?我是PL/SQL的初学者.任何帮助,将不胜感激.谢谢

DECLARE
  CURSOR c_emps IS
    SELECT employee_id
      FROM bonus;

  v_region HR.REGIONS.region_name%TYPE;
  v_salary hr.employees.salary%TYPE;

BEGIN
  FOR r_emps IN c_emps LOOP
    SELECT reg.region_name, emp.salary
      INTO v_region, v_salary
      FROM hr.employees   emp,
           hr.departments dep,
           hr.Locations   loc,
           hr.countries   cot,
           hr.regions     reg
     WHERE emp.department_id = dep.department_id AND
           dep.location_id = loc.location_id AND
           loc.country_id = cot.country_id AND
           cot.region_id = reg.region_id AND
           employee_id = r_emps.employee_id;

    IF v_region = 'Europe' THEN
      UPDATE bonus
         SET bonus = bonus + (v_salary * .01)
       WHERE employee_id = r_emps.employee_id;
    ELSE
      UPDATE bonus …
Run Code Online (Sandbox Code Playgroud)

oracle plsql

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

将Java中的String转换为VARCHAR IN SQL

我正在尝试用Java编写PL/SQL.我想将一个参数作为String传递,但在SQL过程中它是一个VARCHAR(140).但是,当我运行程序时,它给我一个错误,我不明白为什么?

这是我的SQL程序:

CREATE OR REPLACE PROCEDURE task1
 (input_tweet_id IN integer, input_user_id IN integer, input_time IN timestamp, input_tweet IN varchar(140))
is
begin
    INSERT INTO tweet(tweetid, userid, publishtime, tweet)
    VALUES (input_tweet_id,input_user_id,input_time,input_tweet);
END;
Run Code Online (Sandbox Code Playgroud)

Java调用:

    int in_tweet_id = 0;
    int in_user_id = 0;
    Timestamp in_time =null;
    String in_tweet ="";

 Connection conn = DriverManager.getConnection (connStr, uname, passwd);
 CallableStatement cstmt = conn.prepareCall("{? = call task1(?, ?)}");
       // cstmt.registerOutParameter (1, oracle.jdbc.OracleTypes.CURSOR);
        cstmt.setInt(1, in_tweet_id);
        cstmt.setInt(2, in_user_id);
        cstmt.setTimestamp(3,in_time);
        cstmt.setString(4,in_tweet);
Run Code Online (Sandbox Code Playgroud)

错误:

 at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
        at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:131)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:197)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:261)
        at …
Run Code Online (Sandbox Code Playgroud)

java sql database plsql

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

添加两个小时到时间戳

我有一个触发器,必须将时间戳设置为当前时间加上插入前字段为空时的两个小时.我到目前为止所做的一个陈述是

IF :new.time_to_live IS NULL THEN
    :new.time_to_live := sysdate + INTERVAL '0 02:00:00.0' HOUR TO MINUTE;
END IF;
Run Code Online (Sandbox Code Playgroud)

但我得到第二行的PLS-00166错误(日期,时间,时间戳或间隔文字的格式错误).还修改了多个论坛中的几个建议,但错误仍然存​​在.该列创建如下:

time_to_live timestamp(0) NOT NULL
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql timestamp intervals

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

在SQL中减去上一行减去当前行

我有一张桌子orders.

如何减去列的上一行减去当前行 Incoming

在此输入图像描述

有人可以帮忙吗

sql oracle plsql oracle-apex

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

如何捕获Oracle异常"ORA-06535:OPEN中的语句字符串是NULL还是0长度"?

我想捕获异常的特殊异常"ORA-06535:OPEN中的语句字符串是NULL或0长度"

但无法弄清楚它的确切"异常名称".请注意我不想在通用的其他异常块下捕获它.

EXCEPTION
   WHEN <exception_name1> 
   THEN 
      executable_statements;
   WHEN <exception_nameN> 
   THEN
      executable_statements;

   WHEN OTHERS 
   THEN
      executable_statements;
END;
Run Code Online (Sandbox Code Playgroud)

oracle plsql

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

从plsql输出/返回CLOB值(指定的无效LOB定位符:ORA-22275)

我已经存储了plsql程序,它从文件中获取大文本

create or replace 
procedure dbst_load_a_file( p_file_name in varchar2, l_clob  out  clob )
    as
        l_bfile   bfile;
        dst_offset  number := 1 ;
        src_offset  number := 1 ;
        lang_ctx    number := DBMS_LOB.DEFAULT_LANG_CTX;
        warning     number;
    begin
        l_bfile := bfilename( 'SCHEMES_OF_PS', p_file_name );
        dbms_lob.fileopen( l_bfile );
        dbms_lob.loadclobfromfile(
          DEST_LOB     => l_clob
        , SRC_BFILE    => l_bfile
        , AMOUNT       => dbms_lob.getlength( l_bfile )
        , DEST_OFFSET  => dst_offset
        , SRC_OFFSET   => src_offset
        , BFILE_CSID   => DBMS_LOB.DEFAULT_CSID
        , LANG_CONTEXT => lang_ctx
        , WARNING      => warning);
        dbms_lob.fileclose( l_bfile );
    end; …
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql blob clob

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