小编diz*_*iaq的帖子

如何理解避免全表扫描

我有一个表负责存储日志.DDL是这样的:

CREATE TABLE LOG(
    "ID_LOG" NUMBER(12,0) NOT NULL ENABLE, 
    "DATA" DATE NOT NULL ENABLE, 
    "OPERATOR_CODE" VARCHAR2(20 BYTE), 
    "STRUCTURE_CODE" VARCHAR2(20 BYTE), 

     CONSTRAINT "LOG_PK" PRIMARY KEY ("ID_LOG")
 );
Run Code Online (Sandbox Code Playgroud)

有这两个指数:

CREATE INDEX STRUCTURE_CODE ON LOG ("OPERATOR_CODE");

CREATE INDEX LOG_01 ON LOG ("STRUCTURE_CODE", "DATA") ;
Run Code Online (Sandbox Code Playgroud)

但是这个查询产生了一个完整的表扫描:

SELECT log.data AS data1, 
       OPERATOR_CODE,
       STRUCTURE_CODE
  FROM log
 WHERE data BETWEEN to_date('03/03/2008', 'DD-MM-YYYY')
                AND to_date('08/03/2015', 'DD-MM-YYYY')
   AND STRUCTURE_CODE = '1601';
Run Code Online (Sandbox Code Playgroud)

为什么我总是看到一个FULL TABLE SCANDATASTRUCTURE_CODE

(我也试过创建两个不同的索引STRUCTURE_CODE,DATA但我总是进行全表扫描)

sql oracle query-optimization full-table-scan

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

包的初始化部分

这是包规范:

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 plsql initialization package

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

如何比较组中的行?

我有一张表如下:

 INS_SEQ |  NAME |     DATE
-----------------------------
       1 | willy | 15/11/10
       2 |   zoe | 15/11/20
       3 | willy | 15/11/20
       4 | willy | 15/11/10
       5 | willy | 15/11/21
       6 |   zoe | 15/11/17
       7 | willy | 15/11/12
       8 |   zoe | 15/11/20
       9 |   zoe | 15/11/30
... and other values ...
Run Code Online (Sandbox Code Playgroud)

按列分组NAME返回:

 INS_SEQ |  NAME |     DATE
----------------------------
       1 | willy | 15/11/10
       3 | willy | 15/11/20
       4 | willy | …
Run Code Online (Sandbox Code Playgroud)

sql oracle group-by

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

如何防止 Maven 在 Windows 中退出控制台?

环境:Windows 10,,Java 11.0.10Maven 3.8.1

有一个简单的批处理文件run.bat

mvn clean package
echo After build
Run Code Online (Sandbox Code Playgroud)

call run.bat从命令行执行时,我得到了 Maven 构建的完整输出,但该行After build永远不会打印到控制台。输出的最后一行是Process finished with exit code NN=0如果构建成功,N=1否则)。

一种可能性是使用start在单独的进程中运行maven,但问题是需要顺序执行:

mvn clean package
command X            // depends on the previous command artifact
Run Code Online (Sandbox Code Playgroud)

假设 Maven 在内部调用,我不确定如何实现这一点exit

有没有办法mvn在同一脚本中与其他命令一起按顺序执行命令?

cmd batch-file exit-code maven

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

如何知道用户是否拥有对象权限?

我想知道用户是否拥有对象的权限。

我正在研究 SQL Developer。

当我手动查询表DBA_TAB_PRIVS 时,我得到了所有需要的信息。

但是,我需要在某些触发器和函数中使用这些信息。

因此,我正在编写 PL/SQL 函数,如果角色具有特权,则返回 1,否则返回 0。

CREATE OR REPLACE FUNCTION HAS_PRIVILEGE_ON_OBJECT(rolename      IN VARCHAR2,
                                                   objectname    IN VARCHAR2,
                                                   objectowner   IN VARCHAR2,
                                                   privilegename IN VARCHAR2)
  RETURN NUMBER
AS
  output NUMBER;
  BEGIN

    SELECT count(*) INTO output
      FROM dba_tab_privs
     WHERE grantee = rolename
       AND owner = objectowner
       AND table_name = objectname
       AND privilege = privilegename;

    IF output > 0 THEN
      RETURN 1;
    ELSE
      RETURN 0;
    END IF;
  END has_privilege_on_object;
Run Code Online (Sandbox Code Playgroud)

该函数不编译并说:

ORA 942:表或视图不存在。

连接的用户可以访问视图 DBA_TAB_PRIVS,因为我可以查询它,但是在尝试使用函数自动化它时。它不起作用。

请问有什么想法吗?

sql oracle privileges plsql

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

为什么添加 module-info 后 Java 无法读取相同的资源文件?

有一个具有标准 Maven 文件夹结构的简单 Java 项目。

src
  main
    java
      mypackage
        Main.java
    resource
      abc
        cde.txt  
Run Code Online (Sandbox Code Playgroud)

Main.java(省略样板)

var path = "abc/cde.txt";
InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream(path);

if (input == null) {
    throw new IllegalStateException("Resource not found");
} else {
   // read from input
}
Run Code Online (Sandbox Code Playgroud)

该代码工作正常并从绝对路径
"%project_root%/target/classes/abc/cde.txt"(编译后的代码)读取文件。

添加文件后src/main/java/module-info.java情况发生变化:程序找不到文件并抛出in branch (input == null)

如何以旧方式从“资源”文件夹中读取文件并同时拥有:资源文件夹中的java模块和资源?我想避免"src/main/resources"到处添加前缀。

java resources classloader java-module

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

找不到匹配的记录时返回NULL

我正在将一个员工编号传递给一个函数并返回加入日期.

我希望在找不到匹配的记录时返回NULL; 在我的情况下,它只是返回空白或空行;

get_join_date(in_emp_no)

CREATE OR REPLACE FUNCTION get_join_date(in_emp_no) RETURN DATE IS
  v_join_date DATE;
  BEGIN
    SELECT joined_date
    INTO v_date
    FROM employee
    WHERE employee_number = in_emp_no
          AND type = in_type;

    IF v_join_date IS NOT NULL        THEN
      v_join_date := v_date;
    ELSE
      v_join_date = NULL;
    END IF;

    RETURN v_join_date;
  END;
Run Code Online (Sandbox Code Playgroud)

oracle plsql function

0
推荐指数
1
解决办法
616
查看次数

在Oracle SQL中,null = null吗?

我无法测试是否null = null,因为我没有权限在我正在使用的数据库上创建数据.

我的问题是:

如果我有一个包含两行的表:

Row 1: ItemID = 1, CollectionID = 1, Price = null
Row 2: ItemID = 2, CollectionID = 1, Price = null
Run Code Online (Sandbox Code Playgroud)

我的查询如下:

SELECT CollectionID
  FROM my_table TB
 WHERE Price >= (SELECT avg(Price)
                   FROM my_table 
                  WHERE TB.CollectionID = CollectionID);
Run Code Online (Sandbox Code Playgroud)

collectionID 1在结果中显示吗?换句话说,我们有for 和for的值.TB.CollectionIDCollectionID

TB.CollectionID = CollectionID吗?

mysql oracle null

0
推荐指数
1
解决办法
204
查看次数

如何使用`execute immediate`为变量赋值?

我试图execute immediate用作分配变量值的特殊要求.我使用以下代码并获得如下异常.

declare
  lv_kyc_main_GBL KYC_GBL_MAIN.KYC_MAIN%rowtype;
  l_str varchar2(400);

  a number(10);
begin
  select *
    into lv_kyc_main_GBL
    from KYC_GBL_MAIN.KYC_MAIN
   where rownum = 1;

  -- l_str:='lv_kyc_main_GBL.legal_name'||':='||'''TEST''';

  l_str := 'lv_kyc_main_GBL.legal_name := ''TEST''';
  dbms_output.put_line(l_str);

  execute immediate (l_str);
end;
/
Run Code Online (Sandbox Code Playgroud)

我得到的例外是:

anonymous block completed
lv_kyc_main_GBL.legal_name := 'TEST'
Run Code Online (Sandbox Code Playgroud)

在命令的第4行开始出错:

declare
  lv_kyc_main_GBL KYC_GBL_MAIN.KYC_MAIN%rowtype;
  l_str varchar2(400);

  a number(10);
begin
  select *
    into lv_kyc_main_GBL
    from KYC_GBL_MAIN.KYC_MAIN
   where rownum = 1;

  --l_str:='lv_kyc_main_GBL.legal_name'||':='||'''TEST''';

  l_str := 'lv_kyc_main_GBL.legal_name := ''TEST''';
  dbms_output.put_line(l_str);

  execute immediate (l_str);
end;
/

Error report:
ORA-00900: invalid SQL statement
ORA-06512: …
Run Code Online (Sandbox Code Playgroud)

oracle plsql dynamic-sql execute-immediate

0
推荐指数
1
解决办法
2291
查看次数

当客户端中止请求时,WebFlux 如何停止发布者?

SpringBoot v2.5.1

有一个端点请求长时间运行的进程结果,并且它是以某种方式创建的
(为简单起见,它是Mono.fromCallable( ... long running ... ).

客户端发出请求并触发发布者执行工作,但几秒钟后客户端中止请求(即连接丢失)。并且该过程仍然继续利用资源来计算丢弃的结果。

通知 Project Reactor 事件循环有关应取消的不必要的正在进行的工作的机制是什么?

@RestController 
class EndpointSpin {
 
  @GetMapping("/spin")
  Mono<Long> spin() {
    AtomicLong counter = new AtomicLong(0);
    Instant stopTime = Instant.now().plus(Duration.of(1, ChronoUnit.HOURS));

    return Mono.fromCallable(() -> {

      while (Instant.now().isBefore(stopTime)) {
        counter.incrementAndGet();

        if (counter.get() % 10_000_000 == 0) {
          System.out.println(counter.get());
        }

        // of course this does not work
        if (Thread.currentThread().isInterrupted()){
           break;
        }
      }

      return counter.get();
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

java reactive-programming cancellation project-reactor spring-webflux

0
推荐指数
1
解决办法
1388
查看次数