【问题标题】:How to read the PL/SQL code in an Oracle Forms .FMT file?如何读取 Oracle Forms .FMT 文件中的 PL/SQL 代码?
【发布时间】:2010-09-18 19:37:53
【问题描述】:

Oracle Forms10g 提供了一个工具来将 Oracle Forms 模块从 Oracle Forms Builder 使用的二进制格式 (.FMB) 转换为文本格式 (.FMT)。

例如,如果您使用 Oracle Forms Builder 创建一个名为 mymodule.fmb 的模块,然后调用

frmcmp module=mymodule.fmb script=yes batch=yes logon=no

从命令行,Oracle Forms Convert 实用程序将从文件 mymodule.fmb 创建一个名为 mymodule.fmt 的文件。这个文本文件应该是人类“可读”的,除了触发器和程序单元的 PL/SQL 代码,这是编码的。

例如,这是一个 .FMT 文件的 sn-p,其中包含一大块编码的 PL/SQL 代码

DEFINE  F50P
BEGIN
   PP = 10
   PI = 3
   PN = 464
   PL = 1138
   PV = (BLONG)
<<"
00000049 00800000 00440000 00000000 00000031 0000000d 00000002 a0011519 
00002420 0000045e 001f0000 00165030 5f32335f 4f43545f 32303038 31365f33 
375f3039 00000006 42454749 4e0a0000 0042676f 5f626c6f 636b2820 27504149 
53455327 20293b0a 69662066 6f726d5f 73756363 65737320 7468656e 0a096578 
65637574 655f7175 6572793b 0a656e64 2069663b 00000005 0a454e44 3b000000 
1d574845 4e2d4e45 572d464f 524d2d49 4e535441 4e434520 28466f72 6d290000 

你有没有尝试过解码这种文件,以便能够提取表单的 PL/SQL 代码?

如果能够在大量 .FMT 文件的 PL/SQL 代码中搜索字符串,而不是使用 Oracle Forms Builder 手动打开每个对应的 .FMB 文件,然后搜索字符串,这将非常有用在他们每个人中。

谢谢!

【问题讨论】:

  • 回到 Forms 4.5(当“Developer 2000”是一个时髦的未来主义名称时)PL/SQL 代码是 FMT 文件中的文本 - 所以你可以搜索代码 - 实际上你也可以找到它在 FMB 文件中。也许 oracle 故意混淆它?
  • 我错了,字节只是字符的十六进制值(见下面我的帖子)
  • 如果您所做的只是搜索文本,您应该能够很好地 grep 二进制文件。我一直使用 python 和正则表达式来发现哪些表单会受到给定存储过程的影响。

标签: oracle oracle10g oracleforms


【解决方案1】:

除了 API 之外,请注意,如果您在此过程的开始工作,生成 XML 版本可能会比 FMT 版本更好。 FMT 是一种较旧的格式,为了向后兼容而保留,最近发布的 Forms -> Oracle APEX 转换器等工具将需要 XML。它也更容易阅读。

在“Forms 10g 第 1 版”(9.0.4) 中,XML 转换器是一个单独的命令行程序。表单2xml。我认为 10.1 仍然如此

此外,XML 更易于阅读和解释。

【讨论】:

  • 谢谢! PL/SQL 以纯文本形式存储在 XML 中,它是一种更好的搜索格式
【解决方案2】:

字节只是字符的十六进制值。例如:取第 4 行并将其放入以下 ​​python 代码中:

[chr(x) for x in [0x53,0x45,0x53,0x27 ,0x20,0x29,0x3b,0x0a ,0x69,0x66,0x20,0x66 ,0x6f,0x72,0x6d,0x5f ,0x73,0x75,0x63,0x63 ,0x65,0x73,0x73,0x20 ,0x74,0x68,0x65,0x6e ,0x0a,0x09,0x65,0x78]]

给出以下输出:

['S', 'E', 'S', "'", ' ', ')', ';', '\n', 'i', 'f', ' ', 'f', 'o', 'r', 'm', '_', 's', 'u', 'c', 'c', 'e', 's', 's', ' ', 't', 'h', 'e', 'n', '\n', '\t', 'e', 'x']

这是可识别的pl/sql形式。因此,创建一个脚本来获取 FMT 文件目录并生成带有可搜索文本的相应文件似乎不会有太多工作。
玩得开心!

【讨论】:

  • 出于搜索的目的,我将从输出中删除所有不可打印的字符(例如 0x00)。谢谢!
【解决方案3】:

Oracle Forms 9i 及更高版本具有编程 API,可让您完全按照您的描述进行操作。您需要查看您的 Forms 文档才能执行此操作,但它可能比尝试提取二进制字符串更快。

如果您愿意为现有工具付费,请使用以下工具:

http://www.orcl-toolbox.com/

他们的 formsAPI 和 FormsTools 可让您对表单进行提取、比较、更改和更新。

【讨论】:

    【解决方案4】:

    根据this页面作者有一个perl脚本将十六进制转换回ascii文本(他说给他发一封电子邮件,他会发送)

    【讨论】:

      猜你喜欢
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-08
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      相关资源
      最近更新 更多