China Mobile Group (Henan) Improves Data Processing Speed by 40%

Mike Dietrich | Feb 28, 2010 23:44 +0000

2010_02_28_China2.jpg

"We experienced significant improvements in performance for our Business Analysis Support System after we upgraded to Oracle 11g. We can run queries against a 300TB database and receive responses in seconds. This ensures our staff and managers always have the customer, network, sales, and other business information they need to make decisions or develop business plans." -
Guo Qiang, Second Class Technology Specialist, Business Support Center, China Mobile Communications Group Henan Mobile Co., Ltd

Please read the full customer success story to get more information on how China Mobile Group (Henan) upgraded to a four-node database cluster that delivered a 40% improvement in data processing performance. The scalability of the platform also ensures it can support data growth of 3TB a day with ease.

OBIEE: Single/Detail Record View

oraclenerd | Feb 28, 2010 23:34 +0000
Recently, I've been searching for a Single Row/Detail type report in Answers. Sadly, there isn't one so named.

Here's what I could find in Answers:

report types

Nothing jumps out at me, so, Twitter to the rescue again



Within minutes...I had an answer from Mr. Christian Berg. What was that answer? The Narrative View.

Here's the screen for the Narrative View:

narrative view screen

According to Mr. Berg, you reference the columns using the @1 (@2, @3, etc) syntax, the number representing the column number. So I tried that

narrative view with stuff

Run it...

not what I want

That's not what I want...

OK, so let's see if I can add some HTML to it. First I check the Contains HTML Markup box and then I enter in the following in the Narrative Text Area:
@1<br>

@2<br>
@3<br>
@4<br>
@5<br>
@6<br>
@7<br>
@8<br>
@9<br>
Here's what it looks like:

a better narrative look

Better, but not exactly what I want. Now that I know I can use HTML though, it should be very easy.

perfect!

Voila!

Upgrade Workshop in Beijing – 01-MAR-2010

Mike Dietrich | Feb 28, 2010 22:51 +0000

Thanks to all of you attended at our todays upgrade workshop in the Oracle office in Beijing. Great pleasure for us to speak to so many people :-)

Please download the most recent version of the slides in English:
http://apex.oracle.com/folien
Use the keyword (Schluesselwort): upgrade112

And if you are interested in Transportable Tablespaces please find a presentation in English here:
http://apex.oracle.com/folien
Use the keyword (Schluesselwort): tts

2010_02_28_China1.jpg
Happy New Year!!!

Random Things: Volume#16

oraclenerd | Feb 28, 2010 21:44 +0000
EBS Challenge
John Piwowar wrote the first part of the EBS Installation Guide back in December, since then, it's become a runaway success. I hadn't realized how so until recently when I was looking at Google Analytics and it came it at number 19, for all time. Now it's up to 13 and with the addition of it to the front page, it should only go up faster.



I've never had a post that was this popular so I thought it fitting that John should get the recognition that he deserves. If you decide to take part and then write it up, let me know and I'll link you up to The EBS Challengepage. I think there are 4 people that have completed it so far. I'll even give you space here if you don't have your own blog.

Travel
Got the best color car ever this week.



OBI EE
For some reason my original, Learning Oracle Business Intelligence (OBIEE) post, has been near the top of the charts for multiple search phrases.
So I did what any sane person would do, I updated it with some new information. Not really sure if it's new, but it's got more. If people are finding it, I might as well update it as often as possible.

The Obligatory Calculator in JSF 2.0

Buttso | Feb 28, 2010 21:32 +0000



Checked out some of the high level JSF 2.0 new features recently using NetBeans 6.8 and GlassFish v3.  For what it's worth, I think they are very usable, feature rich and effcient pairing for conducting Java EE 6 development.

As with all old habits, some won't die.  And my habit for taking a quick look at any new programming language/framework is to build a very simple calculator with one screen and some simple calculation logic.

With NetBeans, creating a new Web project is trivial.  To add JSF support select it as a framework to use.

After a bit of navel gazing, I realized a significant part of the unholy dislike I had for JSF 1.2 and its earlier versions predominantly stemmed from the need to live in the configuration red zone -- faces-config.xml. Every damned thing that you wanted to use or access pretty much needed to be defined in the configuration file: managed beans definitions with packages/classes and names and scopes, even the most simples of page navigation paths, etc.

But as of JSF 2.0, that has mostly changed! Accomodating a convention over configuration model for page navigation and making use of annotations for declaring managed bean components (and associated runtime attributes and property values) in my simple example, I didn't have to even look at the faces-config.xml file.  Happy Days.

Here's my simple CalculatorManagedBean, which is responsible for performing the arduous task of calculating a result from a given two values and an operand. It also supplies the operand values for the screen to display.

To declare this as a ManagedBean, all I had to do was to add the @ManagedBean annotation. I also decided to bind this ManagedBean into each clients HttpSession so it was created once, and was able to store property values set from eacg clients page.

 1 package sab.demo.calc.beans;
 2 
 3 import java.io.Serializable;
 4 import javax.annotation.PostConstruct;
 5 import javax.faces.bean.ManagedBean;
 6 import javax.faces.bean.SessionScoped;
 7 
 8 @ManagedBean(eager=true)
 9 @SessionScoped
10 public class CalculatorManagedBean implements Serializable {
11 
12     public static char[] operands = { '+', '-', '*', '/' };
13 
14     int value1;
15     int value2;
16     char operand;
17     String result;
18 
19     public CalculatorManagedBean() {
20     }
21 
22     public char[] getOperands() {
23         return operands;
24     }
25     
26     public char getOperand() {
27         return operand;
28     }
29 
30     public void setOperand(char operand) {
31         System.out.printf("setOperand: %s", operand);
32         this.operand = operand;
33     }
34 
35     public String getResult() {
36         return result;
37     }
38 
39     public void setResult(String result) {
40         this.result = result;
41     }
42 
43     public int getValue1() {
44         return value1;
45     }
46 
47     public void setValue1(int value1) {
48         System.out.printf("setValue1: %s\n", value1);
49         this.value1 = value1;
50     }
51 
52     public int getValue2() {
53         return value2;
54     }
55 
56     public void setValue2(int value2) {
57         System.out.printf("setValue2: %s\n", value2);
58         this.value2 = value2;
59     }
60 
61     public void calculate() {
62         switch(getOperand()) {
63             case '+' :
64                 result = String.valueOf(value1 + value2);
65                 break;
66             case '-' :
67                 result = String.valueOf(value1 - value2);
68                 break;
69             case '*' :
70                 result = String.valueOf(value1 * value2);
71                 break;
72             case '/' :
73                 double v1 = value1;
74                 double v2 = value2;
75                 result = String.valueOf(v1 / v2);
76                 break;
77         }
78         System.out.printf("Calculate: %s %s %s = %s\n",
79                 getValue1(),
80                 getOperand(),
81                 getValue2(),
82                 getResult());
83 
84     }
85 
86     @PostConstruct
87     public void postConstruct() {
88         System.out.println("postConstruct");
89         operand = '+';
90         value1 = 0;
91         value2 = 0;
92         result = "n/a";
93     }
94 }
95 
96 

With the ManagedBean taken care of, the next step was to create the JSF page. With JSF 2.0, it now uses Facelets as the default view technology instead of JSP. This means there are lots of things that are able to be expressed more naturally in the view layer, which were previously difficult or cumbersome in the older JSP model.

A really useful thing I found in facelets was the ability to render a ManagedBean property directly in the page, without needing to surround it with other tag library calls.

So to create my calculator screen, I simply added a couple of fields, and wired them into the CalculatorManagedBean that I'd developed. Again, following convention over configuration, the default name for a ManagedBean is a lower case version of the classname, which makes them easy to remember/lookup from a project hierachy (as opposed to hunting through XML). Of course NetBeans makes this easy since it has code-insight which presents the names of known ManagedBeans and their available properties for insertion via a few keystrokes.

The list of operands values shown in the select list are populated from a property on the ManagedBean which returns an array of char.

The "=" button is wired into the calculate operation, which takes its current property values, performs the desired operation and sets the result property, which is then displayed in the result field on the page.

 1 <?xml version='1.0' encoding='UTF-8' ?>
 2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 3 <html xmlns="http://www.w3.org/1999/xhtml"
 4       xmlns:f="http://java.sun.com/jsf/core"
 5       xmlns:h="http://java.sun.com/jsf/html">
 6     <h:head>
 7         <title>Calculator Facelet</title>
 8     </h:head>
 9     <h:body>
10         <h:column><h3 style="font-family: arial; font-variant: small-caps; color: #336699">Calculator</h3></h:column>
11         <h:form>
12             <h:panelGrid columns="1" style="text-align: center; border: 1px solid #336699; padding: 5px; ">
13             <h:column>
14                 <h:inputText id="value1" value="#{calculatorManagedBean.value1}" 
15                              size="5" maxlength="5" style="text-align: right;"/>
16             </h:column>
17             <h:column>
18                 <h:inputText id="value2" value="#{calculatorManagedBean.value2}" 
19                              size="5" maxlength="5" style="text-align: right"/>
20             </h:column>
21             <h:panelGrid columns="2">
22                 <h:column >
23                     <h:selectOneMenu id="operand" value="#{calculatorManagedBean.operand}" 
24                                      style="text-align: center;">
25                         <f:selectItems value="#{calculatorManagedBean.operands}"/>
26                     </h:selectOneMenu>
27                 </h:column>
28                 <h:column><h:commandButton value="=" action="#{calculatorManagedBean.calculate}"/></h:column>
29             </h:panelGrid>
30             <h:column>
31                 <h:inputText id="result" value="#{calculatorManagedBean.result}" 
32                              readonly="true" size="5" style="font-weight: bold; text-align: right"/>
33             </h:column>
34         </h:panelGrid>
35         </h:form>
36     </h:body>
37 </html>
38 
39 
40 

Put it all together and run using the local GlassFish instance, the page works and looks like this.


So there it is, a JSF 2.0 version of my old habit up and running in a few minutes. I like what I've seen with JSF 2.0 so far.

Of course, the use of @ManagedBean annotation in JSF 2.0 may be dead already with the arrival of CDI in Java EE 6 and its @Named annotation, but that's not an issue I'm going to explore here.

SQLSaturday Open for Registration

Eddie Awad | Feb 28, 2010 20:26 +0000

On the weekend of May 22, 2010, the Portland Development community is coming together in a way never experienced before.

Using the University of Portland campus, SQLSaturday, Portland Code Camp, and Portland Bar Camp are combining and coordinating efforts to bring 800-1000 regional technology professionals together for the opportunity to immerse themselves in seminars, presentations, group exploration, and networking. Participants will be able to engage in their preferred technology, as well as to 'sample' other options

Admittance to this event is free, all costs are covered by donations and sponsorships. Please register soon as seating is limited, and let friends and colleages know about the event.

>> Click here to register.

Portland SQLSaturday is encouraging presentations related to interoperability of any of the SQL platforms, including T-SQL (SQL Server), PostgreSQL, MySQL, and Oracle PL/SQL. Abstracts for Platform specific sessions are also encouraged. The event is scheduled on Saturday May 22, 2010 from 8:00 AM until 10:00 PM.

Most sessions will be one hour and fifteen minutes (1:15), and a few 'deep dive' sessions will be longer (2.5 hours). The  'deep dive' sessions will be scheduled for 7:00 PM (after the snacks and refreshments.) Also, throughout the day, there may be opportunities for 30 minute 'SQL snack' sessions.

>> Click here to submit your presentation abstract.

I encourage all Oracle SQL and PL/SQL enthusiasts living in the Pacific Northwest to present in and/or attend this not-to-be-missed event.

Posted via email from EddieAwad.com

Related articles:

E-Business Suite Security and DBMS_LDAP.INIT

Hi Folks, Vulnerability in E-Business Suite R12 requires non-default diagnostics mode so Low risk. http://www.securityfocus.com/archive/1/509460 Having said that it is worth keeping an eye on Internet facing Oracle applications, though there is not a huge amount on this from O’Reilly and Apress. Google books has a relevant book free of charge named “Security, Audit and Control Features Oracle E-Business [...]

Back to Basics: Changing the Font Setting in SQL Developer

Sue | Feb 28, 2010 19:23 +0000
An ongoing request in SQL Developer is to have the ability to update the font size in a Data Grid. In the all the releases up to and including SQL Developer 2.1, you can't change the font in the data grid, you can control the full IDE font and the font for the editors, but that's it. Well SQL Developer 2.1.1 has an update to that.

I wrote about changing fonts when we first started SQL Developer, so I'm going to recap the functionality before adding the 2.1.1 tidbit.
The thing about the fonts in SQL Developer is that they essentially controlled through the underlying framework or IDE. (now more commonly referred to as the Fusion Client Platform). So to change the font for the full product, that is the Navigators, Menus, Dialogs and so on, you need to shutdown the product update the font for the IDE, which is locates the ide.properties file in the system folder.

This system folder is created the first time you start SQL Developer and, by default, is located in the C:\Documents and Settings\\Application Data\SQL Developer\system2.1.1.64.38\ folder. Once you have located your system folder, find the sub folder o.sqldeveloper.11.1.1.64.38 (this is the latest SQL Developer 2.1.1 patch, but you can browse the the version of the product you are working with). Edit the ide.properties file and uncomment the FontSize propert. So change
# Ide.FontSize=11 to your font size of choice, for example;

Ide.FontSize=16

Restart SQL Developer.

Notice that this does not affect the SQL Worksheet and Data Grids. Once you are back in SQL Developer select Tools > Preferences. Expand the Code Editor node in the tree and select Font. Changing this font setting increases the size of the font for any of the code editors. In SQL Developer 2.1.1, changing this font size also affect the output of the SQL Worksheet script output and the Data Grids.

Of course, there are lots of folk who just want the Editors and Data Grids to be resized, in which case, you don't need to edit the ide.properties file.

This has been a much request feature on our Exchange, I hope the update helps those of you who have been looking for this support.

I Heart Recursive Subquery Factoring (Recursive Common Table Expressions)

I enjoy attending RMOUG Training Days because it is an educational workshop, not a gigantic trade show like Oracle OpenWorld. The presentations are not “customer success stories” or sales pitches; they are technical presentations on technical topics that matter to database administrators and developers. Here is a picture taken at the speaker reception at Training Days 2010 sent [...]

Test drive Oracle Data Mining on the Amazon Cloud

mark.hornick@oracle.com | Feb 28, 2010 18:00 +0000
ODMontheCloud-sm.jpgNow you can access Oracle Data Mining on the Amazon Cloud with a pre-installed Oracle 11gR2 Database and sample datasets. Using the Oracle 11gR2 Data Mining Amazon Machine Image (AMI), you can now launch an Oracle Data Mining-enabled instance directly through Amazon Web Services (AWS) and connect to it using the Oracle Data Miner Classic graphical user interface.

Click here for complete details and a step-by-step guide to launching and connecting to an Oracle Data Mining AMI instance.

Twitter Weekly Updates for 2010-02-28

Lewi | Feb 28, 2010 17:23 +0000

Powered by Twitter Tools

An Electronic Billboard in an Airport

(author unknown) | Feb 28, 2010 16:24 +0000

(am I being too sensitive here...?)

Have you noticed these nasty-looking characters on advertisements displayed prominently in many U.S. airports? www.Downwithbigerp.com There are images of these greedy fat cats, "It's not about you, it's about us!"

"Big ERP".... And do they think they are talking about me??? Ouch.
Boy, those are some expensive ads. A lot of money, and, can we talk? These ads are mean! Someone could get their feelings hurt. What if I ran ads saying, "Down with the San Francisco Giants," with cartoons of their miserable bullpen? Not exactly an uplifting message from these advertisers.

Here is an observation: this advertiser is too late. Their message is targeted at huge, rigid, monolithic, heavily-customized, interwoven business architectures from the client/server days. Circa 1998.

Oracle has moved on. These people need to go to a seminar on Service Oriented Architecture. The Oracle Applications business has grown well beyond the footprint of tight, well-integrated business transaction systems. Our customers are making plans for agile, heterogeneous, well-orchestrated enterprise business systems.

High Value Business Applications to Surround ERP

Institutions of Higher Education have made significant investments in core enterprise business application systems, often referred to as "ERP" - Enterprise Resource Planning. The traditional 3 pillars of Higher Education ERP are Human Resources, Financial Management, and Student Information Systems. Most Higher Education ERP systems, once modernized, use relational data structures, so the institution is ready to take advantage of their investment to extend and build on the business system platform. Typical high value targets include projects for improved administrative efficiency, student experience, self-service, shared services, enterprise performance management, business planning insight, data quality, compliance and controls.

Oracle is a major provider of Higher Education ERP applications, featuring our PeopleSoft Enterprise and Oracle E-Business Suite offerings. We compete in this sector with other software enterprise provider firms, a variety of specialists, and the Higher Education open source movement (Kuali). Of course, legacy and custom systems remain in the landscape.

As college and university senior managers plan for expansion and build on their core business transaction system platform, Oracle offers a set of high-value business applications. Rated best in class, these applications can operate as key components alongside any brand of core ERP. Summarized below, these new applications deserve the attention of Higher Education executives.

Financial Planning and Analysis

Oracle Hyperion solutions for Enterprise Performance Management provides a complete environment for key budget, measurement, and planning collaborative processes, including:

  • Operational planning and budgeting
  • Strategic planning
  • Program contribution analysis / cost and profitability modeling
  • Position Budgeting for workforce management
  • Financial consolidation with master financial data management
  • Multidimensional data analysis and modeling (Oracle Essbase product line)

Student Recruiting, Retention, and Services Center

Oracle CRM On Demand can be implemented quickly by school, department, special program, distance learning, non-credit workforce development programs, or enterprise-wide.

  • Subscription-based offering, software as a service ("SaaS")

Governance, Risk, and Compliance Management

Oracle Governance, Risk, and Compliance Suite offers a unique, proactive, closed-loop approach to regulatory compliance, risk management, and controls automation.

Business Intelligence / Decision Support

  • Oracle Business Intelligence includes a full set of graphics-enabled reporting, dashboard, Web and portal publishing, and drill-down tools to be used with any business application.
  • Data marts, fact tables, key performance indicators are pre-designed and delivered for most critical business decision areas, such as Recruitment/ Talent Management or Spend Management.
  • Oracle Business Intelligence can be used both internally for performance management, peer analysis, institutional research, and for external purposes such as governance reporting or longitudinal outcomes analysis.
Person Data Synchronization
  • Oracle Higher Education Constituent Hub provides multi-way synchronization, governance, and cleansing of your most valuable data asset.
  • Oracle Higher Education Constituent Hub's value proposition increases with heterogeneous campus application systems to include SIS, Learning Management, CRM, Library, Housing, Identity Management, Directory Services, Emergency Contact and Donor Management (Advancement).

Capital Assets, Maintenance, Real Estate, Facilities, and Project Management

Best in class process and business applications acquired as intellectual property from JD Edwards, Primavera, and PeopleSoft provide compliance, control and performance management information in these high-dollar asset areas.

User Readiness / Process Documentation

  • User acceptance and competency ramps are significantly improved using the Oracle User Productivity Kit. Teaching, assessment, and documentation techniques are supported.
  • Accuracy and cross-training effectiveness increase, especially for business processes that are infrequent or complex in nature.
  • Process design modeling with user involvement is supported by Oracle User Productivity Kit.

Applications Integration

Oracle Fusion Middleware is an open, standards-based platform for customer architectures designed to manage the cost and durability of software integration.

Oracle Fusion embraces service-oriented architecture (SOA) for heterogeneous, managed software integration, including:

  • Oracle SOA Suite
  • Oracle Service Bus (repository)
  • Oracle Application Integration Architecture
  • Oracle Identity Management


HEUG Alliance Conference 2010 - San Antonio Approaches

Oracle is eager to discuss these new areas of our expanded product footprint. All of these capabilities, in the context of our product roadmap, will be covered by our product experts at the Alliance conference, as well as at AACRAO in April.

Speaking of the Higher Education User Group (HEUG), I want to take this opportunity to thank and congratulate Stan Jakubik of University System of Maryland. Stan is concluding a very successful term as President of the HEUG, which featured a remarkably high level of collaboration between Oracle and our Higher Ed customers. Stan was featured in a recent published article, "A Case for Synergy," discussing his observations on how user groups and vendors can work together toward mutually beneficial accomplishments. Thanks Stan, and best of luck as a "Past President" of HEUG.

New Batch execution mode

Anthony Shorten | Feb 28, 2010 16:14 +0000

A new feature of the batch framework for Oracle Utilities Application Framework V2.2 has been released and is available from My Oracle Support. This feature allows greater control and stability of the batch framework using Oracle Coherence as the Work Manager and Named Cache Manager.

The feature is available in My Oracle Support under Patch 9166248. If you have Oracle Utilities Application Framework Service Pack 6 installed you need the following additional fixes (prerequisites):

  • 7638488
  • 8845615
  • 9069631
  • 9325651

The new feature allows a CLUSTERED execution mode that allows threadpool workers to be clustered (or not) across machines or within machines. The feature has the following advantages over the default DISTRIBUTED mode:

  • Stability - The threadpoolworker and submitter (submitjob) processes now are aware of the status of each other. If, for any reason, they fail then the relevant parties are informed and the batch execution record updated.
  • Clustering - It is possible to spread threadpoolworkers across machines (or wihin machines) to form a threadpool cluster. You can then submit jobs to the cluster and not have to worry about where it is actually running. This also improves stability in that as long as one node in a cluster is active, jobs will process.
  • Multiple protocol support - Threadpool clusters can use unicast or multicast protocols (multi-cast is the default).
  • Reduction in use of F1_TSPACE_ENTRY - The DISTRIBUTED mode uses F1_TSPACE_ENTRY as a co-ordination point.This may cause synchronization issues when either the threadpoolworker or submitter would fail. Oracle Coherence takes over this role with F1_TSPACE_ENTRY used for presistence only. This enables submitters and worker nodes to communicate better.

The Product Fix Document (PFD) provided with the fix gives you examples and details of the new facility. New versions of the Batch documentation will be released soon (watch this blog) that will outline additional advice for implementing this facility.

This enhancement applies to any Oracle Utilities Application Framework V2.2 (and above) based product which includes:

  • Oracle Utilities Customer Care And Billing V2.2 and above
  • Oracle Enterprise Taxation Management V2.2 and above
  • Oracle Utilities Business Intelligence V2.2 and above

I will be posting additional blog entries over the next few weeks with additional advice and explanation of this new functionality.

Oracle ASM (Automatic Storage Management) 11.1 with a 10Gr2 database

The last couple of weeks I’ve been working on converting on of my Databases to ASM. As databases grow adding more disk breaks performance if file systems are being used at many levels and to control performance Oracle released ASM which would provide RAW disk performance with dynamic re-balancing. This was precisely one of [...] Related posts:
  1. Using EMC Clones and IBM ESS FlashCopy to Backup your Database Lets Face it. Todays Databases are getting bigger and bigger...
  2. User Defined Metrics in Oracle EM Grid Control Everyone has various ways to manage scripts. I have found...
  3. Getting it right It seems that today’s DBA is not only tasked with...
Related posts brought to you by Yet Another Related Posts Plugin.

Fresh From Twitter today

Eddie Awad | Feb 28, 2010 13:51 +0000

Hey @ptrwsk if you want me to follow you back on Twitter, tell me who you are. At least include a short bio. http://s.awads.net/8Yb1Wa
MS and Oracle’s big dev tools – who needs ‘em? http://s.awads.net/d6PDDR
IT job trends – Which technologies you should learn next http://s.awads.net/a7Mfvv
Access Oracle Data Mining on the Amazon Cloud with a pre-installed Oracle 11gR2 DB. Here is how http://s.awads.net/c3AaUv
Create Google Short URLs without the Toolbar http://s.awads.net/afF8n4

Related articles:

Oracle BI EE 10.1.3.4.1 – Puzzlers – Puzzle 4 – Bypassing Security

Venkatakrishnan J | Feb 28, 2010 13:36 +0000

On to the 4th puzzle in this Puzzle series. This is a very interesting Puzzle at least from the perspective of BI EE Security. We all know that BI EE provides comprehensive security within the repository. For example, the screenshot below shows that the column CHANNEL_DESC can be accessed only by the exec user.

image

Now when we log in as any user(users who do not belong to Administrators group) and open the report containing this secured column, we will either be getting an error or will be shown as NULL in reports depending on the PROJECT_INACCESSIBLE_COLUMN_AS_NULL property in the NQSConfig.ini. The question is how do we bypass the security and still show the CHANNEL_DESC column(with their values of course) in reports. I know this sounds a bit malicious and can even be read as a security hack, but this is currently possible in BI EE(in the solution i will let you know how to use a workaround to disable this though). The question or the Puzzle today is how do we achieve this. There are some potential use cases of this

1. If you do not have access to the repository but still want to look at certain security protected columns to validate certain reports

2. If you do not have a column in the repository at all (but exists in the database) and you still want to access it.

Remember this is not about enabling Direct Database Requests as in most cases that will always be disabled. For example, if you look at the report below, CHANNEL_DESC has become null for the user i have logged in as this user does not have access to this column(PROJECT_INACCESSIBLE_COLUMN_AS_NULL  is set to YES in my case).

image

If you look at the SQL, you will notice that the CHANNEL_DESC column is not even pushed back to the database.

WITH
SAWITH0 AS (select sum(1) as c1,
     T4167.CHANNEL_ID as c2
from
     CHANNELS T4167
group by T4167.CHANNEL_ID)
select distinct SAWITH0.c2 as c1,
     cast(NULL as  VARCHAR ( 1 ) ) as c2,
     SAWITH0.c1 as c3
from
     SAWITH0
order by c1, c2

which is good and as expected. Now, the puzzle is to somehow bypass this security and display the CHANNEL_DESC column as shown below.

image

Remember, there are 2 pre-conditions to this

1. No Direct Database Requests

2. No changing the repository to add a new column in the presentation layer

Tom Kyte in Moscow

February, 24th. Renaissance Moscow Hotel. Over 300 of people in hall and Tom Kyte on stage – that is “AskTom in Moscow” for the first time. I heard that Tom is a great speaker. I can confirm – he is. I’d say live Tom’s presentations are fascinating: nice voice, appropriate talking speed, simple examples and very [...]

Statistics on Partitioned Tables – Part 5

Actually, before looking at any recent features, let me introduce one more aspect of the existing aggregation approach used by Oracle. The examples used to date have been based on INSERTing new rows into subpartitions and, although that's the approach used for some of our tables and will suit some systems, the likelihood is that in a near-real-time DW you will be using partition exchange at some point. Which means we need to understand how the stats might be gathered and then aggregated up to the partition and table-level stats.

Although there might be other approaches, I'd say that there are two distinct approaches you are likely to use.

1) Create a temporary load table, load it with data, gather statistics on it and then exchange it with the relevant subpartition in the real table.

2) Create a temporary load table, load it with data, exchange it with the relevant subpartition and then gather stats on the subpartition.

Pete Scott left a comment on a previous post stating that he rarely uses approach 1 so no doubt he'll leave another comment here expanding on his reasons ;-) What I want to show you is what happens if you do use approach 1 and introduce the _minimal_stats_aggregation hidden parameter that's been kicking around since Oracle 8i. The default setting of the parameter is TRUE, which means that Oracle minimises automatic stats aggregation activity. Let's see that in action.

First of all I'll recreate TEST_TAB1 as it was at the start of the series and add a new partition (and, by implication, the related subpartitions) and create a seperate table that I'll load the data into.

SQL> ALTER TABLE TEST_TAB1
  2  ADD  PARTITION P_20100209 VALUES LESS THAN (20100210);

Table altered.

SQL> DROP TABLE LOAD_TAB1;

Table dropped.

SQL> CREATE TABLE LOAD_TAB1
  2  AS SELECT * FROM TEST_TAB1 WHERE 1=0;

Table created.

SQL> CREATE UNIQUE INDEX LOAD_TAB1_IX1 ON LOAD_TAB1
  2  (REPORTING_DATE, SOURCE_SYSTEM, SEQ_ID)
  3  NOPARALLEL COMPRESS 1;

Index created.

Now I'll use LOAD_TAB1 to repeat the same process for the four different subpartitions - INSERT data into LOAD_TAB1, gather stats on it and then exchange it with the relevant subpartition of TEST_TAB1.

SQL> INSERT INTO LOAD_TAB1 VALUES (20100209, 'GROT', 400, 'P');

1 row created.

SQL> INSERT INTO LOAD_TAB1 VALUES (20100209, 'GROT', 600, 'P');

1 row created.

SQL> INSERT INTO LOAD_TAB1 VALUES (20100209, 'GROT', 900, 'Z');

1 row created.

SQL> exec dbms_stats.gather_table_stats('TESTUSER', 'LOAD_TAB1');

PL/SQL procedure successfully completed.

SQL> ALTER TABLE test_tab1 EXCHANGE SUBPARTITION P_20100209_GROT WITH TABLE load_tab1;

Table altered.

SQL> ALTER TABLE test_tab1 MODIFY SUBPARTITION  P_20100209_GROT REBUILD UNUSABLE LOCAL INDEXES;

Table altered.

SQL> TRUNCATE TABLE LOAD_TAB1;

Table truncated.

SQL> INSERT INTO LOAD_TAB1 VALUES (20100209, 'JUNE', 400, 'U');

1 row created.

SQL> INSERT INTO LOAD_TAB1 VALUES (20100209, 'JUNE', 600, 'U');

1 row created.

SQL> INSERT INTO LOAD_TAB1 VALUES (20100209, 'JUNE', 900, 'U');

1 row created.

SQL> exec dbms_stats.gather_table_stats('TESTUSER', 'LOAD_TAB1');

PL/SQL procedure successfully completed.

SQL> ALTER TABLE test_tab1 EXCHANGE SUBPARTITION P_20100209_JUNE WITH TABLE load_tab1;

Table altered.

SQL> ALTER TABLE test_tab1 MODIFY SUBPARTITION  P_20100209_JUNE REBUILD UNUSABLE LOCAL INDEXES;

Table altered.

SQL> TRUNCATE TABLE LOAD_TAB1;

Table truncated.

SQL> INSERT INTO LOAD_TAB1 VALUES (20100209, 'HALO', 400, 'N');

1 row created.

SQL> INSERT INTO LOAD_TAB1 VALUES (20100209, 'HALO', 600, 'N');

1 row created.

SQL> INSERT INTO LOAD_TAB1 VALUES (20100209, 'HALO', 900, 'N');

1 row created.

SQL> exec dbms_stats.gather_table_stats('TESTUSER', 'LOAD_TAB1');

PL/SQL procedure successfully completed.

SQL> ALTER TABLE test_tab1 EXCHANGE SUBPARTITION P_20100209_HALO WITH TABLE load_tab1;

Table altered.

SQL> ALTER TABLE test_tab1 MODIFY SUBPARTITION  P_20100209_HALO REBUILD UNUSABLE LOCAL INDEXES;

Table altered.

SQL> TRUNCATE TABLE LOAD_TAB1;

Table truncated.

SQL> INSERT INTO LOAD_TAB1 VALUES (20100209, 'ZZZZ', 400, 'P');

1 row created.

SQL> INSERT INTO LOAD_TAB1 VALUES (20100209, 'ZZZZ', 600, 'P');

1 row created.

SQL> INSERT INTO LOAD_TAB1 VALUES (20100209, 'ZZZZ', 900, 'Z');

1 row created.

SQL> exec dbms_stats.gather_table_stats('TESTUSER', 'LOAD_TAB1');

PL/SQL procedure successfully completed.

SQL> ALTER TABLE test_tab1 EXCHANGE SUBPARTITION P_20100209_OTHERS WITH TABLE load_tab1;

Table altered.

SQL> ALTER TABLE test_tab1 MODIFY SUBPARTITION  P_20100209_OTHERS REBUILD UNUSABLE LOCAL INDEXES;

Table altered.

All of the P_20100209 subpartitions have stats that were swapped in as part of the partition exchange operation so hopefully there'll be some aggregated global statistics.

SQL> select  table_name, global_stats, last_analyzed, num_rows
  2  from dba_tables
  3  where table_name='TEST_TAB1'
  4  and owner='TESTUSER'
  5  order by 1, 2, 4 desc nulls last;

TABLE_NAME                     GLO LAST_ANALYZED          NUM_ROWS                                              
------------------------------ --- -------------------- ----------                                              
TEST_TAB1                      NO                                                                               

SQL> select  table_name, partition_name, global_stats, last_analyzed, num_rows
  2  from dba_tab_partitions
  3  where table_name='TEST_TAB1'
  4  and table_owner='TESTUSER'
  5  order by 1, 2, 4 desc nulls last;

TABLE_NAME                     PARTITION_NAME                 GLO LAST_ANALYZED          NUM_ROWS               
------------------------------ ------------------------------ --- -------------------- ----------               
TEST_TAB1                      P_20100131                     NO                                                
TEST_TAB1                      P_20100201                     NO                                                
TEST_TAB1                      P_20100202                     NO                                                
TEST_TAB1                      P_20100203                     NO                                                
TEST_TAB1                      P_20100204                     NO                                                
TEST_TAB1                      P_20100205                     NO                                                
TEST_TAB1                      P_20100206                     NO                                              
TEST_TAB1                      P_20100207                     NO                                                  
TEST_TAB1                      P_20100209                     NO                                                   

9 rows selected.

Oh, well, that doesn't seem to have worked. Maybe the LOAD_TAB1 stats weren't gathered correctly or didn't appear as part of the subpartition exchange operation?

SQL> select  table_name, subpartition_name, global_stats, last_analyzed, num_rows
  2  from dba_tab_subpartitions
  3  where table_name='TEST_TAB1'
  4  and table_owner='TESTUSER'
  5  order by 1, 2, 4 desc nulls last;

TABLE_NAME                     SUBPARTITION_NAME              GLO LAST_ANALYZED          NUM_ROWS                                   
------------------------------ ------------------------------ --- -------------------- ----------                                    
TEST_TAB1                      P_20100131_GROT                NO                                                         
TEST_TAB1                      P_20100131_HALO                NO                                                                    
TEST_TAB1                      P_20100131_JUNE                NO                                                        
TEST_TAB1                      P_20100131_OTHERS              NO                                                

<<output snipped>>

TEST_TAB1                      P_20100209_GROT                NO  28-FEB-2010 21:41:47          3                
TEST_TAB1                      P_20100209_HALO                NO  28-FEB-2010 21:41:49          3                
TEST_TAB1                      P_20100209_JUNE                NO  28-FEB-2010 21:41:49          3                
TEST_TAB1                      P_20100209_OTHERS              NO  28-FEB-2010 21:41:50          3                

36 rows selected.


The subpartition stats are ok, then, but the aggregation process hasn't happened and that's because _miminal_stats_aggregation is set to TRUE (the default) which instructs Oracle to minimise aggregation operations and one of the ways it does so is to not aggregate statistics as a result of a partition exchange operation but to leave you to do that manually by gathering stats on the table partition. If we were to modify the parameter to a non-default value (and, being an underscore parameter, that's your own choice at your own risk ...), we would see different behaviour. I ran the same script, but with this small addition that changes the parameter setting at the session level.

SQL> alter session set "_minimal_stats_aggregation"=FALSE;

Session altered.

Which will change the end result to this ...

SQL> select  table_name, global_stats, last_analyzed, num_rows
  2  from dba_tables
  3  where table_name='TEST_TAB1'
  4  and owner='TESTUSER'
  5  order by 1, 2, 4 desc nulls last;

TABLE_NAME                     GLO LAST_ANALYZED          NUM_ROWS                                             
------------------------------ --- -------------------- ----------                                             
TEST_TAB1                      NO                                                                              

SQL>
SQL> select  table_name, partition_name, global_stats, last_analyzed, num_rows
  2  from dba_tab_partitions
  3  where table_name='TEST_TAB1'
  4  and table_owner='TESTUSER'
  5  order by 1, 2, 4 desc nulls last;

TABLE_NAME                     PARTITION_NAME                 GLO LAST_ANALYZED          NUM_ROWS              
------------------------------ ------------------------------ --- -------------------- ----------              
TEST_TAB1                      P_20100131                     NO                                               
TEST_TAB1                      P_20100201                     NO                                               
TEST_TAB1                      P_20100202                     NO                                               
TEST_TAB1                      P_20100203                     NO                                               
TEST_TAB1                      P_20100204                     NO                                               
TEST_TAB1                      P_20100205                     NO                                               
TEST_TAB1                      P_20100206                     NO                                               
TEST_TAB1                      P_20100207                     NO                                               
TEST_TAB1                      P_20100209                     NO  28-FEB-2010 21:41:53         12              

9 rows selected.

Note that there are still no statistics at the table level because not all of the partitions have stats yet, so aggregation can't take place, but there are aggregated statistics on the P_20100209 partition, because all of the relevant subpartitions do have stats.

All you need to remember is that the default setting of _minimal_stats_aggregation means that, unless you explicitly gather statistics on the partitions you've just exchanged, aggregation will not take place! Actually, copying stats will also invoke the aggregation process too, but I'll deal with that in the next post. (Updated later. That last sentence might not be true. I've just tried something at home and I'm seeing different results at work, so more investigation needed.)

Oh, and there's much more on this subject over on Randolf Geist's blog post.

Data encryption for ERP sensitive data (HR and Finance)

We have had several clients asked to implement Oracle eBS encryption schemes.

The Oracle Database provides *transparent data encryption” (TDE). The purpose of this is to encrypt sensitive data so that someone cannot steal the physical media of the database (e.g., disks) and read the data directly of the disk (bypassing Oracle security).

Encryption for clones -> This is less worthless than trying to encrypt columns in production tables (which people always seem to want to do for some reason).

we tend not to use encryption for the purpose of protect data in clones. Instead, I prefer to scrub the sensitive data completely, via a process like this…

1) DBA clones production
2) DBA runs “cleaning” script to
- A) create a randomly-generated, fake, but real-looking value for every sensitive value in the database. E.g., if you have 2,000 SSNs, it will create 2,000 dummy SSNs (but in the XXX-XX-XXXX format). It will store the real/fake SSN pairs in a mapping table.
- B) use the mapping table to update all real SSNs to their fake ones. This keeps consistency among the data.
- C) drop the mapping table (completely drop — watch out for the recycle bin, flashback database, etc). Doing this right takes a bit of thought.
3) DBA makes the cloned instance available to users/developers/etc

I like this approach for several reasons:
1) It keeps the cloned data “real looking”. A function, for example, that strips the dashes from an SSN will continue to work. Processes won’t fail or work funny because credit card numbers are too short or too long.

2) It gets around the problem that encrypted values are often longer than the unencypted values (especially if you want to base64 encode them so you can store them in a VARCHAR column, which you would). This becomes a problem when the encrypted values are too long to fit in the column width that Oracle designed.
3) It is irreversable. With encryption, someone who knows the process and key can reverse it. (True, you could use a cryptographic hash instead, but then you have potential collisions to worry about).

I’ve implemented this approach to protect SSNs, bank account numbers, credit card numbers, etc. It seems acceptable.


Filed under: Oracle Functional

Why many ERP implementations fall short of expectations and how to prevent failure?

Normally if you understand why ERP implementations fail then most probably you could address the issues accordingly, and I think there are more solutions for each of the below reasons for failure:
- not understanding what an ERP is about – functionality and intrinsic requirements
- not evaluating/assessing ERP’s functionality beforehand
- not getting the accept/involvement of all stakeholders + politics
- not addressing the requirements beforehand, especially in the area of processes
- not evolving/improving your processes
- not addressing the data cleaning/conversion adequately
- not integrating the ERP with the other solutions existing in place
- not having in place a (Master) Data Management vision/policy that addresses especially data quality and data ownership
- not involving the (key) users early in the project
- not training and motivating adequately the users
- lack of a reporting framework, set of reports (reporting tools) that enables users to make most of the ERP
- lack of communication between business and IT professionals
- relying too much on external resources, especially in the PM area
- the migration of workforce inside the organization or outside (e.g. consultants coming and leaving)
- inadequate PM, lack of leadership
- the lack of a friendly User Interface (referring to the ERP system itself)
- inadequate post-Go Live support from the ERP vendor and business itself
- the lack of an ERP to evolve with the business
- too many defects in the live system (results often from inadequate testing but also vendor related issues)
- too many changes on the last 100m of the project
- organization’s culture
- attempting to do too much in lesser time than needed/allocating more time than needed.

No matter how many methodologies people like to philosophy with, between theory and practice it’s a long way, in addition not two projects are the same given the various contexts, constraints and requirements. A methodology that worked in one context might not work in another, people who performed well in one project might not perform well in another, and so on… If somebody’s coming with a 100% guarantee that the ERP implementation will succeed no matter what, I would regard its optimism with reserves, and those who worked in several implementations know what I’m talking about.

There are so many articles already on this topic, everybody searching for the Holy Grail of ERP implementations…


Filed under: Oracle Functional