我有很大的Oracle函数,用于计算6个表中的数据.
create or replace FUNCTION STATISTICS_FUNCTION(NAMEIN IN VARCHAR2
)
RETURN CLOB
AS
LAST_60_CPU NUMBER;
.............
LINE CLOB;
CURSOR LAST_60_CPU_CURSOR IS
.................
BEGIN
LINE := EMPTY_CLOB();
DBMS_LOB.CREATETEMPORARY(LINE,true);
OPEN LAST_60_CPU_CURSOR;
LOOP
FETCH LAST_60_CPU_CURSOR INTO LAST_60_EVENT_DATE, LAST_60_CPU;
....................
DBMS_LOB.APPEND(LINE, TO_CHAR(LAST_60_EVENT_DATE));
DBMS_LOB.APPEND(LINE, 'I');
DBMS_LOB.APPEND(LINE, TO_CHAR(LAST_60_CPU));
DBMS_LOB.APPEND(LINE, CHR(10));
END LOOP;
CLOSE LAST_60_CPU_CURSOR;
DBMS_LOB.APPEND(LINE, 'LAST_60_CPU');
DBMS_LOB.APPEND(LINE, CHR(10));
.......................................................
-------------------------------------
DBMS_OUTPUT.PUT_LINE(LINE);
RETURN LINE;
END STATISTICS_FUNCTION;
Run Code Online (Sandbox Code Playgroud)
我使用这个Java代码来调用函数:
public void callFunction() throws SQLException
{
// initialize the driver and try to make a connection
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection conn = …Run Code Online (Sandbox Code Playgroud) 这是包规范:
CREATE OR REPLACE PACKAGE employee_info
IS
PROCEDURE p;
FUNCTION f RETURN BOOLEAN;
END employee_info;
Run Code Online (Sandbox Code Playgroud)
这是包体:
CREATE OR REPLACE PACKAGE body employee_info
IS
PROCEDURE p IS
BEGIN
dbms_output.put_line('This is procedure');
dbms_output.put_line(chr(10));
END;
FUNCTION f RETURN BOOLEAN IS
BEGIN
dbms_output.put_line('This is function ');
dbms_output.put_line(chr(10));
RETURN true;
END;
BEGIN
dbms_output.put_line('This is the initialization section of package body');
END employee_info;
Run Code Online (Sandbox Code Playgroud)
我什么时候应该使用包的初始化部分?
如上例所示,当我第一次执行代码时,我只能看到package body的begin..end被执行,而其余的调用则不会执行.
我正在使用以下语句执行过程和函数:
execute employee_info.p;
declare
p1 boolean;
begin
p1 := employee_info.f;
end;
Run Code Online (Sandbox Code Playgroud) 我想在Oracle表中创建随机数据:
CREATE TABLE EVENTS(
EVENTID INTEGER NOT NULL,
SOURCE VARCHAR2(50 ),
TYPE VARCHAR2(50 ),
EVENT_DATE DATE,
DESCRIPTION VARCHAR2(100 )
)
/
Run Code Online (Sandbox Code Playgroud)
我试过这个:
BEGIN
FOR loop_counter IN 1..1000
LOOP
INSERT INTO EVENTS (EVENTID, SOURCE, TYPE, EVENT_DATE, DESCRIPTION) VALUES (loop_counter, loop_counter, 'warning',
DBMS_RANDOM.VALUE(TO_CHAR(DATE '2000-01-01','J') ,TO_CHAR(DATE '9999-12-31','J')), dbms_random.value(1,100));
END LOOP;
COMMIT;
END;
Run Code Online (Sandbox Code Playgroud)
我收到此错误异常
错误报告 - ORA-06550:第5行,第13列:PL/SQL:ORA-00932:不一致的数据类型:预期DATE得到NUMBER ORA-06550:第4行,第1列:PL/SQL:SQL语句忽略06550. 00000 - "行%s,列%s:\n%s"*原因:通常是PL/SQL编译错误.*行动:
你能告诉我如何解决这个问题吗?
我是SQL编程的新手.
我需要制作一个比较日期的程序.过程中唯一的参数是用户在Java程序中键入的日期.我需要检查一下这个参数(日期)是否在一年前.换句话说,我需要将它与SYSDATE减去一年进行比较.如果是这种情况,我必须"清除"与"时间表"相关的所有表格(其中有2个).
例如,假设用户输入2013-04-13,我的程序必须将它与SYSDATE进行比较 - 1年(在这种情况下,它将是2014-12-03).由于该值小于今天减去一年,因此必须清除表"MovieSchedule"和"ChannelSchedule".如果输入的日期是2014-12-16,因为它现在超过SYSDATE减去一年,该过程必须发回一个我将能够在Java程序中使用的显式错误.
现在,正如我所说,我对PL/SQL中的程序编程完全不熟悉,所以我可以通过在互联网上查找教程来提出这些内容:
CREATE OR REPLACE
PROCEDURE purge_schedule(purgeDate date) AS
DECLARE
currentDate := to_date(SYSDATE, 'YYYMMDD');
BEGIN
-- IF purgeDate < (currentDate - 1year)
-- delete content in "MovieSchedule" and "ChannelSchedule"
-- ELSE
-- return explicit error
END purge_schedule;
Run Code Online (Sandbox Code Playgroud)
我甚至不知道这是否是编写我想要的程序的正确方法.正如你所看到的,我的问题是如何在程序中实现我的条件,而不是它背后的逻辑.我责怪我缺乏语言练习.
如果您需要更多信息以帮助我,请告诉我是否需要更具体.谢谢你的帮助,祝你有个美好的一天:)
可以说我有一张桌子如下-
create table employees
(
eno number(4) not null primary key,
ename varchar2(30),
zip number(5) references zipcodes,
hdate date
);
Run Code Online (Sandbox Code Playgroud)
我使用以下代码块创建了一个触发器
create or replace TRIGGER COPY_LAST_ONO
AFTER INSERT ON ORDERS
FOR EACH ROW
DECLARE
ID_FROM_ORDER_TABLE VARCHAR2(10);
BEGIN
SELECT MAX(ORDERS.ONO)INTO ID_FROM_ORDER_TABLE from ORDERS ;
DBMS_OUTPUT.PUT_LINE(ID_FROM_ORDER_TABLE);
INSERT INTO BACKUP_ONO VALUES( VALUE1, VALUE2,VALUE3, ID_FROM_ORDER_TABLE);
END;
Run Code Online (Sandbox Code Playgroud)
触发器在插入后触发,并尝试从触发它的表中读取(逻辑上是duhh!),但是oracle给我一个错误,并要求我修改触发器,以便它不读取表。错误代码-
Error report -
SQL Error: ORA-04091: table TEST1.ORDERS is mutating, trigger/function may not see it
ORA-06512: at "TEST1.COPY_LAST_ONO", line 8
ORA-04088: error during execution of trigger 'TEST1.LOG_INSERT' …Run Code Online (Sandbox Code Playgroud) 我使用while循环来计算Pl Sql中从1到10的整数.
这是代码:
set serveroutput on;
declare
i number := 0;
sum number := 0;
begin
while i <= 10 loop
sum := sum + i ;
i := i + 1;
end loop;
dbms_output.put_line ( sum );
end;
/
Run Code Online (Sandbox Code Playgroud)
这里有什么问题?
这是错误消息:
sum := sum + i ;
*
ERROR at line 6:
ORA-06550: line 6, column 12:
PLS-00103: Encountered the symbol "+" when expecting one of the following:
(
ORA-06550: line 9, column 28:
PLS-00103: Encountered the symbol ")" …Run Code Online (Sandbox Code Playgroud) 我选择的id地方不能等于0,值也不能(null).我写:
WHERE id IS NOT NULL (+) and id not in ('0')
Run Code Online (Sandbox Code Playgroud)
我有2个错误
错误(9,5):PL/SQL:忽略SQL语句
错误(38,119):PL/SQL:ORA-00933:SQL命令未正确结束我将其更改为:
WHERE id IS NOT NULL (+) and id is not ('0')
Run Code Online (Sandbox Code Playgroud)
发生了相同的错误 我应该写什么作为WHERE条款?
使用此代码,我无法多次运行插入查询; 它只询问ID和名称一次(如果计数器中的值大于1).
declare
counter number := 0 ;
begin
counter := &counter ;
while counter > 0 loop
insert into customer values ( &id, '&name' ) ;
counter := counter - 1 ;
end loop ;
end ;
Run Code Online (Sandbox Code Playgroud)
让我借助一个例子来解释: -
说我把值2放入counter.有了它,它应该问我两次ID和名称,但它只询问一次,并将我输入的ID和名称的值复制到表中test两次.
我怎样才能解决这个问题?如果我不能那么请建议替代代码来解决我的问题.
是否有一种简单的方法可以在声明表示其键的变量时引用PLSQL中关联数组的索引类型?
我正在寻找类似于下面的语言结构.
DECLARE
i number;
j i%type;
BEGIN
null;
END;
Run Code Online (Sandbox Code Playgroud)
我希望能够做那样的事情.
DECLARE
type ty_my_type is table of number index by varchar2(4);
my_array ty_my_type;
-- key my_array.key%type;
-- or
-- key my_array%keytype;
BEGIN
null;
END;
Run Code Online (Sandbox Code Playgroud) 我有两个名为Patient and pharmacy的表.每个患者与一个药房唯一关联.我想在这些表之间的运行时创建外键约束.
Create table patient
(patient_Id varchar2(5) primary key,
patient_name varchar2(20));
Create table pharmacy
(pharmacy_Id varchar2(5) primary key,
pharmacy_name varchar2(20);
Create table patient_pharmacy_mapper
(patient_Id varchar2(5) references patient(patient_Id),
pharmacy_Id varchar2(5) references pharmacy(pharmacy_Id));
Run Code Online (Sandbox Code Playgroud)
我不是在设计时编写"引用",而是可以在运行时创建/删除这些外键约束(当任何DML语句触发时)?
我对创建一个触发器知之甚少,我们必须使用"Alter table语句"调用一个过程.