我对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中,它立即起作用,但这似乎并非如此.
我有一段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> 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) 这是包规范:
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) 如何在不使用的情况下重构这些代码行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) 我正在尝试用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) 我有一个触发器,必须将时间戳设置为当前时间加上插入前字段为空时的两个小时.我到目前为止所做的一个陈述是
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) 我有一张桌子orders.
如何减去列的上一行减去当前行 Incoming

有人可以帮忙吗
我想捕获异常的特殊异常"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) 我已经存储了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) plsql ×10
oracle ×9
sql ×6
database ×2
arrays ×1
blob ×1
clob ×1
constraints ×1
intervals ×1
java ×1
oracle-apex ×1
recordtype ×1
timestamp ×1