Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java与SQL映射器_Java_Sql - Fatal编程技术网

Java与SQL映射器

Java与SQL映射器,java,sql,Java,Sql,好的,这就是我要做的。假设我有几个视图,每个视图都可以有别名,诸如此类,每个视图返回到另一个视图、视图或表。我想做的是跟踪一个特定的字段,从它的视图一直到源代码。 例如,如果我有以下sql语句: replace view blah Select t.acct_nmbr as I_account, sum (t.num1+p.location) as location, from blahTable as t left outer join blahTable2 p on t.acct_nmbr

好的,这就是我要做的。假设我有几个视图,每个视图都可以有别名,诸如此类,每个视图返回到另一个视图、视图或表。我想做的是跟踪一个特定的字段,从它的视图一直到源代码。 例如,如果我有以下sql语句:

replace view blah
Select
t.acct_nmbr as I_account,
sum (t.num1+p.location) as location,
from blahTable as t 
left outer join blahTable2 p
on t.acct_nmbr=p.acct_nmbr;
这是一个非常简单的案例,但我想要的是,如果我说trace(I_account),我将得到以下层次结构:

I_account --> blahTable ---> acct_nmbr
或者,如果我想知道位置,我会得到以下信息:

location --> sum (t.num1+p.location)-->blahTable --> num1
------------------------------------------------>blahTable2 --> location

您可以看到,添加越来越多的数据可能会使跟踪变得越来越复杂,尤其是在存在多个联接以及select表和派生表的情况下。我目前正试图从头开始编写代码,但我不确定是否有什么东西已经做到了这一点

我认为这是一个有趣的概念。通常,我可能会尝试递归地遍历一个树结构(就是这个结构)。
然而,你很快就会遇到一些问题

  • 一个视图通常具有对想要从中获取数据的人隐藏实现细节的效果。当应用程序代码查询视图中的数据时,它有的方法来判断不存在这样的表-从它的角度来看,该视图是一个基本级别的表。出于许多原因,这通常是期望的结果(这是数据库版本的封装)。因此,除非您的java代码能够访问视图创建脚本(或者能够以某种方式获得视图的定义),否则您将无法“遍历”结构
  • 聚合函数是潜在的麻烦源。任何切换求值字段的
    CASE
    语句都会出现问题。您还没有列出您的RDBMS,但其中一些RDBMS在某些聚合中支持多列(就像DB2为
    MAX()
    )所做的那样)。这将导致问题,因为目标列依赖于检索到的数据
  • 任何存储过程都有可能使结果完全无效。对我来说,创建一个存储过程来根据一天中的时间更改它访问的表是完全有效的(根据用例,这实际上可能是必要的)。此外,除非您有源代码,否则可能无法完成步行
  • 有一个名为
    Alias
    的命令集,它基本上会报告表(或视图引用)实际指向的位置。这将改变您正在查看的“基本”表(从SQL的角度来看)。根据您获取数据的方式,Java代码可能会解析别名,也可能不会解析别名。在这两种情况下,别名通常是临时的,有可能使结果“过期”
  • 所以,简言之,对于任何类似真实世界场景的事情来说,这几乎是不可能的



    5.您打算如何处理递归CTE(我假设teradata允许它们)?这是点2的一个wierd子集;其中的任何字段要么解析为“基表”(优化器无论如何都将其视为表),要么对基表进行递归。您需要设计程序来检测这种类型的递归,并适当地处理它。不幸的是,您将无法依赖终止条件(在运行时按行计算);不过,谢天谢地,您不必处理循环关系。

    我使用的RDBMS是teradata,我可以在视图上进行显示,并获得具有所有语法和类似内容的视图定义。我想把它放到一个基于数据块的树结构中。IE任何派生表之类的,然后从那里对case语句或sum进行更多处理。您如何在视图上进行“显示”——这是通过java实现的吗?这解决了第1点;其他的呢?你为什么想要这个?这对于您的预期用途来说可能是完全不可能的。是的,我只是运行了查询“show view\u name”,并从中获得了作为字符串的定义。基本上,整个要点是显示字段的来源,无论它是一个表还是一个计算或其他什么,都可以得到视图的来源。如果您尝试为它提供一个表名,会发生什么?如何告诉它某个元素是底层元素?关于其他几点,你希望发生什么?特别是在存储过程的情况下,您无法控制它如何决定源/返回数据?我知道由于特定的数据库以及我的体系结构是如何设计的,我何时到达底层。我可以从teradata的Sql保留字中确定其他几点。程序和函数必须具有左右paran,并且不是保留字。因此,任何不是保留字的内容都必须是函数、过程或表/字段名。如果它有paran,那么它必须是一个函数或过程。在这种情况下,我可以做一个显示,并获得数据以及。