我有2张桌子:
Departament
id_dep, name_dep
Run Code Online (Sandbox Code Playgroud)
雇员
id_dep, salary
Run Code Online (Sandbox Code Playgroud)
我想获得所有工资都低于7000的部门的名称.我必须创建一个SELECT声明.我是SQL的初学者,如果我会浪费你的时间,我很抱歉,但我需要帮助.
我有一个解决方案,但我不知道是否好:
SELECT name_dep
FROM departments
WHERE employee.salary < 7000
MINUS
SELECT name_dep
FROM departments
WHERE employee.salary >= 7000
Run Code Online (Sandbox Code Playgroud) 我知道回滚不应该在错误日志上工作,但应该以合理的方式.让我考虑以下示例.
CREATE OR REPLACE procedure error_ins
AS
BEGIN
INSERT INTO dummy VALUES(4) LOG ERRORS INTO ERROR_LOG_DMLEL;
INSERT INTO dummy VALUES(2) LOG ERRORS INTO ERROR_LOG_DMLEL;
INSERT INTO dummy VALUES(7) LOG ERRORS INTO ERROR_LOG_DMLEL;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
dbms_output.put_line('error ocured');
END;
Run Code Online (Sandbox Code Playgroud)
这里,dummy当发生异常时,表的值将回滚到先前的状态,但ERROR_LOG_DMLEL表中记录的错误不会.
回滚对于错误日志不起作用是好的,但为什么它不起作用?
或者他们需要考虑的其他事情是什么?
我经历了几个文档,我找不到任何参考.
如果有人知道原因请回信.
谢谢.
这是我第一次尝试编写Oracle过程,并且我收到了一个错误(显示在问题标题中)DBMS_OUTPUT.PUT_LINE.
我在网上看到,它只能回传VARCAHR2列,所以我只投了两个VARCHAR2正在访问的非列,但我仍然得到错误.当我尝试直接在oracle SQL Developer中运行它时,会发生此错误.
CREATE OR REPLACE PROCEDURE LOGGING_PRC
(
STARTDATE_IN IN VARCHAR2,
ENDDATE_IN IN VARCHAR2,
NAMES_IN IN VARCHAR2,
MODS_IN IN VARCHAR2,
LOGS_IN IN VARCHAR2,
ID_OUT OUT VARCHAR2,
NAME_OUT OUT VARCHAR2,
MODULE_OUT OUT VARCHAR2,
ENTRYDATE_OUT OUT VARCHAR2,
STATUS_OUT OUT VARCHAR2,
TYPE_OUT OUT VARCHAR2
)
AS
BEGIN
SELECT
CAST(ID_LOG AS VARCHAR2(16)),
APNAME,
APPMOD,
CAST(ENTRYDATE AS VARCHAR2(30)),
APPSTATUS,
LOGTYPE
INTO
ID_OUT,
NAME_OUT,
MODULE_OUT,
ENTRYDATE_OUT,
STATUS_OUT,
TYPE_OUT
FROM
BASE
WHERE
ENTRYDATE > STARTDATE_IN AND
ENTRYDATE < ENDDATE_IN …Run Code Online (Sandbox Code Playgroud) 请检查我的包裹和程序.
我的包裹:
create or replace package transaction1 as
procedure enter_transaction(acc number, kind varchar2, amount number);
procedure apply_transaction;
end;
/
Run Code Online (Sandbox Code Playgroud)
这是我的身体:
create or replace package body transaction1 as
procedure enter_transaction(acc in number, kind in varchar2, amount in number)
is
begin
end;
procedure apply_transaction
is
begin
end;
end;
/
Run Code Online (Sandbox Code Playgroud)
什么是警告?为什么?
我正在阅读专家 - oracle-database-architecture书.汤姆正在解释关于绑定变量的内容.
你能告诉我第一个程序和第二个程序有什么不同吗?根据我的理解,我们execute immediate用来执行动态SQL语句或匿名PL/SQL块.
这是目标表:
create table t ( x int );
Run Code Online (Sandbox Code Playgroud)
以下是过程#1的示例:
ops$tkyte%ORA11GR2> create or replace procedure proc_name1
2 as
3 begin
4 for i in 1 .. 10
5 loop
6 execute immediate
7 'insert into t values ( '||i||')';
8 end loop;
9 end;
10 /
Run Code Online (Sandbox Code Playgroud)
以下是过程#2的示例:
create or replace procedure proc_name2
as
begin
for i in 1 .. 10
loop
insert into t values ( i);
end loop;
end;
Run Code Online (Sandbox Code Playgroud) 我尝试用"施密特"选择所有名字.但有些名字是小写的,有些是大写的.
我试试这个:
Select * from Account
where name like '%chmidt%'
or name like '%CHMIDT%'
Run Code Online (Sandbox Code Playgroud)
但是,如果单词中的一个字母是大写字母(例如SchmidT),那么该语句就没有找到.知道有人解决这个问题的简单方法吗?
我的问题很重要。
我应该执行运行INSERT INTO查询的PL / SQL脚本。看起来像:
DECLARE
newId NUMBER(38,0) := &1;
BEGIN
Insert into FOO ("ID", "DESCRIPTION")
values (newId+1, 'LARGE CLOB WHICH PRODUCES EXCEPTION');
-- A LOT OF INSERT QUERIES
END;
/
exit;
Run Code Online (Sandbox Code Playgroud)
因此,我发现将CLOB分配给VARCHAR2变量是一个好主意,因为它可能是32767字节长。我的目标是针对每个INSERT INTO查询执行此操作。喜欢:
--assign CLOB to VARCHAR2 variable
-- INSERT variable instead of CLOB type
Run Code Online (Sandbox Code Playgroud)
我想指出的是,我INSERT INTO在脚本中有很多查询,因此我应该在每个INSERT INTO查询之前重新分配变量,我该怎么做?
有没有更好的方法在Oracle PL/SQL中打印到STDOUT?
DBMS_OUTPUT.PUT_LINE似乎非常基本和粗糙.应该有类似Python的pprint(Pretty Print)吗?
当减去今天的日期时,给出正确的输出.
select
(TRUNC(to_date('25/05/2016','dd/mm/yyyy'))-TRUNC(to_date('02/01/2016','dd/mm/yyyy')))
from dual;
Run Code Online (Sandbox Code Playgroud)
输出:144天
当今天采取日期时,下面的广告sysdate应该给144.但是显示其他一些值?为什么?
select
(to_date(SYSDATE,'dd/mm/yyyy'))-(to_date('02/01/2016','dd/mm/yyyy'))
from dual;
Run Code Online (Sandbox Code Playgroud)
输出:-730343(显示一些值).
plsql ×10
oracle ×9
sql ×4
clob ×1
database ×1
dynamic-sql ×1
oracle12c ×1
performance ×1
pprint ×1
pretty-print ×1
stdout ×1
unix ×1